ZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI2MC9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI2MC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjBjMmRkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjYwL01ha2VmaWxlCkBAIC0wLDAgKzEsNTMgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAwLTIwMDgKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworaW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCisKK0xJQgk9ICQob2JqKWxpYiQoQ1BVKS5hCisKK1NUQVJUCT0gc3RhcnQubyBrZ2RiLm8KK0NPQkpTCT0gdHJhcHMubyBzZXJpYWxfc21jLm8gc2VyaWFsX3NjYy5vIGNwdS5vIGNwdV9pbml0Lm8gc3BlZWQubyBcCisJICBpbnRlcnJ1cHRzLm8gZXRoZXJfZmNjLm8gaTJjLm8gY29tbXByb2MubyBcCisJICBiZWRidWdfNjAzZS5vIHBjaS5vIHNwaS5vCisKK0NPQkpTLSQoQ09ORklHX0VUSEVSX09OX1NDQykgPSBldGhlcl9zY2MubworCitDT0JKUwkrPSAkKENPQkpTLXkpCisKK1NSQ1MJOj0gJChTVEFSVDoubz0uUykgJChTT0JKUzoubz0uUykgJChDT0JKUzoubz0uYykKK09CSlMJOj0gJChhZGRwcmVmaXggJChvYmopLCQoU09CSlMpICQoQ09CSlMpKQorU1RBUlQJOj0gJChhZGRwcmVmaXggJChvYmopLCQoU1RBUlQpKQorCithbGw6CSQob2JqKS5kZXBlbmQgJChTVEFSVCkgJChMSUIpCisKKyQoTElCKToJJChPQkpTKQorCSQoQVIpICQoQVJGTEFHUykgJEAgJChPQkpTKSAkKG9iailrZ2RiLm8KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGRlZmluZXMgJChvYmopLmRlcGVuZCB0YXJnZXQKK2luY2x1ZGUgJChTUkNUUkVFKS9ydWxlcy5taworCitzaW5jbHVkZSAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI2MC9iZWRidWdfNjAzZS5jIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjYwL2JlZGJ1Z182MDNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk2OWZmNgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI2MC9iZWRidWdfNjAzZS5jCkBAIC0wLDAgKzEsMjM4IEBACisvKgorICogQmVkYnVnIEZ1bmN0aW9ucyBzcGVjaWZpYyB0byB0aGUgTVBDNjAzZSBjb3JlCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGJlZGJ1Zy90eXBlLmg+CisjaW5jbHVkZSA8YmVkYnVnL2JlZGJ1Zy5oPgorI2luY2x1ZGUgPGJlZGJ1Zy9yZWdzLmg+CisjaW5jbHVkZSA8YmVkYnVnL3BwYy5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0JFREJVRykgXAorCSYmIChkZWZpbmVkKENPTkZJR19NUEM4MjRYKSB8fCBkZWZpbmVkKENPTkZJR19NUEM4MjYwKSkKKworI2RlZmluZSBNQVhfQlJFQUtfUE9JTlRTIDEKKworZXh0ZXJuIENQVV9ERUJVR19DVFggYnVnX2N0eDsKKwordm9pZCBiZWRidWc2MDNlX2luaXQgX19QKCh2b2lkKSk7Cit2b2lkIGJlZGJ1ZzYwM2VfZG9fYnJlYWsgX19QKChjbWRfdGJsX3QqLGludCxpbnQsY2hhcipbXSkpOwordm9pZCBiZWRidWc2MDNlX2JyZWFrX2lzciBfX1AoKHN0cnVjdCBwdF9yZWdzKikpOworaW50ICBiZWRidWc2MDNlX2ZpbmRfZW1wdHkgX19QKCh2b2lkKSk7CitpbnQgIGJlZGJ1ZzYwM2Vfc2V0IF9fUCgoaW50LHVuc2lnbmVkIGxvbmcpKTsKK2ludCAgYmVkYnVnNjAzZV9jbGVhciBfX1AoKGludCkpOworCisMCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBJbml0aWFsaXplIHRoZSBnbG9iYWwgYnVnX2N0eCBzdHJ1Y3R1cmUgZm9yIHRoZSBwcm9jZXNzb3IuICBDbGVhciBhbGwKKyAqIG9mIHRoZSBicmVha3BvaW50cy4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKwordm9pZCBiZWRidWc2MDNlX2luaXQoIHZvaWQgKQoreworICBpbnQJaTsKKyAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworICBidWdfY3R4Lmh3X2RlYnVnX2VuYWJsZWQgPSAwOworICBidWdfY3R4LnN0b3BwZWQgPSAwOworICBidWdfY3R4LmN1cnJlbnRfYnAgPSAwOworICBidWdfY3R4LnJlZ3MgPSBOVUxMOworCisgIGJ1Z19jdHguZG9fYnJlYWsgICA9IGJlZGJ1ZzYwM2VfZG9fYnJlYWs7CisgIGJ1Z19jdHguYnJlYWtfaXNyICA9IGJlZGJ1ZzYwM2VfYnJlYWtfaXNyOworICBidWdfY3R4LmZpbmRfZW1wdHkgPSBiZWRidWc2MDNlX2ZpbmRfZW1wdHk7CisgIGJ1Z19jdHguc2V0ICAgICAgICA9IGJlZGJ1ZzYwM2Vfc2V0OworICBidWdfY3R4LmNsZWFyICAgICAgPSBiZWRidWc2MDNlX2NsZWFyOworCisgIGZvciggaSA9IDE7IGkgPD0gTUFYX0JSRUFLX1BPSU5UUzsgKytpICkKKyAgICAoKmJ1Z19jdHguY2xlYXIpKCBpICk7CisKKyAgcHV0cyAoIkJFREJVRzpyZWFkeVxuIik7CisgIHJldHVybjsKK30gLyogYmVkYnVnX2luaXRfYnJlYWtwb2ludHMgKi8KKworCisMCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTZXQvY2xlYXIvc2hvdyB0aGUgaGFyZHdhcmUgYnJlYWtwb2ludCBmb3IgdGhlIDYwM2UuICBUaGUgIm9mZiIKKyAqIHN0cmluZyB3aWxsIGRpc2FibGUgYSBzcGVjaWZpYyBicmVha3BvaW50LiAgVGhlICJzaG93IiBzdHJpbmcgd2lsbAorICogZGlzcGxheSB0aGUgY3VycmVudCBicmVha3BvaW50cy4gIE90aGVyd2lzZSBhbiBhZGRyZXNzIHdpbGwgc2V0IGEKKyAqIGJyZWFrcG9pbnQgYXQgdGhhdCBhZGRyZXNzLiAgU2V0dGluZyBhIGJyZWFrcG9pbnQgdXNlcyB0aGUgQ1BVLXNwZWNpZmljCisgKiBzZXQgcm91dGluZSB3aGljaCB3aWxsIGFzc2lnbiBhIGJyZWFrcG9pbnQgbnVtYmVyLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCit2b2lkIGJlZGJ1ZzYwM2VfZG9fYnJlYWsgKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywKKwkJCSBjaGFyICphcmd2W10pCit7CisgIGxvbmcJCWFkZHI7ICAgICAgICAgICAvKiBBZGRyZXNzIHRvIGJyZWFrIGF0ICAqLworICBpbnQJCXdoaWNoX2JwOyAgICAgICAvKiBCcmVha3BvaW50IG51bWJlciAgICAqLworICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisgIGlmIChhcmdjIDwgMikKKyAgeworICAgIGNtZF91c2FnZShjbWR0cCk7CisgICAgcmV0dXJuOworICB9CisKKyAgLyogVHVybiBvZmYgYSBicmVha3BvaW50ICovCisKKyAgaWYoIHN0cmNtcCggYXJndlsgMSBdLCAib2ZmIiApID09IDAgKQorICB7CisgICAgaWYoIGJ1Z19jdHguaHdfZGVidWdfZW5hYmxlZCA9PSAwICkKKyAgICB7CisgICAgICBwdXRzICggIk5vIGJyZWFrcG9pbnRzIGVuYWJsZWRcbiIgKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB3aGljaF9icCA9IHNpbXBsZV9zdHJ0b3VsKCBhcmd2WyAyIF0sIE5VTEwsIDEwICk7CisKKyAgICBpZiggYnVnX2N0eC5jbGVhciApCisgICAgICAoKmJ1Z19jdHguY2xlYXIpKCB3aGljaF9icCApOworCisgICAgcHJpbnRmKCAiQnJlYWtwb2ludCAlZCByZW1vdmVkXG4iLCB3aGljaF9icCApOworICAgIHJldHVybjsKKyAgfQorCisgIC8qIFNob3cgYSBsaXN0IG9mIGJyZWFrcG9pbnRzICovCisKKyAgaWYoIHN0cmNtcCggYXJndlsgMSBdLCAic2hvdyIgKSA9PSAwICkKKyAgeworICAgIGZvciggd2hpY2hfYnAgPSAxOyB3aGljaF9icCA8PSBNQVhfQlJFQUtfUE9JTlRTOyArK3doaWNoX2JwICkKKyAgICB7CisKKyAgICAgIGFkZHIgPSBHRVRfSUFCUigpOworCisgICAgICBwcmludGYoICJCcmVha3BvaW50IFslZF06ICIsIHdoaWNoX2JwICk7CisgICAgICBpZiggKGFkZHIgJiAweDAwMDAwMDAyKSA9PSAwICkKKwlwdXRzICggIk5PVCBTRVRcbiIgKTsKKyAgICAgIGVsc2UKKwlkaXNwcGMoICh1bnNpZ25lZCBjaGFyICopKGFkZHIgJiAweEZGRkZGRkZDKSwgMCwgMSwgYmVkYnVnX3B1dHMsIEZfUkFESEVYICk7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorCisgIC8qIFNldCBhIGJyZWFrcG9pbnQgYXQgdGhlIGFkZHJlc3MgKi8KKworICBpZighKCggaXNkaWdpdCggYXJndlsgMSBdWyAwIF0gKSkgfHwKKwkoKCBhcmd2WyAxIF1bIDAgXSA+PSAnYScgKSAmJiAoIGFyZ3ZbIDEgXVsgMCBdIDw9ICdmJyApKSB8fAorCSgoIGFyZ3ZbIDEgXVsgMCBdID49ICdBJyApICYmICggYXJndlsgMSBdWyAwIF0gPD0gJ0YnICkpKSkKKyAgeworICAgIGNtZF91c2FnZShjbWR0cCk7CisgICAgcmV0dXJuOworICB9CisKKyAgYWRkciA9IHNpbXBsZV9zdHJ0b3VsKCBhcmd2WyAxIF0sIE5VTEwsIDE2ICk7CisKKyAgaWYoKCBidWdfY3R4LnNldCApICYmICggd2hpY2hfYnAgPSAoKmJ1Z19jdHguc2V0KSggMCwgYWRkciApKSA+IDAgKQorICB7CisgICAgcHJpbnRmKCAiQnJlYWtwb2ludCBbJWRdOiAiLCB3aGljaF9icCApOworICAgIGRpc3BwYyggKHVuc2lnbmVkIGNoYXIgKilhZGRyLCAwLCAxLCBiZWRidWdfcHV0cywgRl9SQURIRVggKTsKKyAgfQorCisgIHJldHVybjsKK30gLyogYmVkYnVnNjAzZV9kb19icmVhayAqLworCisKKwwKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEhhbmRsZSBhIGJyZWFrcG9pbnQuICBFbnRlciBhIG1pbmkgbWFpbiBsb29wLiAgU3RheSBpbiB0aGUgbG9vcCB1bnRpbAorICogdGhlIHN0b3BwZWQgZmxhZyBpbiB0aGUgZGVidWcgY29udGV4dCBpcyBjbGVhcmVkLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCit2b2lkIGJlZGJ1ZzYwM2VfYnJlYWtfaXNyKCBzdHJ1Y3QgcHRfcmVncyAqcmVncyApCit7CisgIHVuc2lnbmVkIGxvbmcJYWRkcjsgICAgICAgICAgIC8qIEFkZHJlc3Mgc3RvcHBlZCBhdCAgICovCisgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyAgYnVnX2N0eC5jdXJyZW50X2JwID0gMTsKKyAgYWRkciA9IEdFVF9JQUJSKCkgJiAweEZGRkZGRkZDOworCisgIGJlZGJ1Z19tYWluX2xvb3AoIGFkZHIsIHJlZ3MgKTsKKyAgcmV0dXJuOworfSAvKiBiZWRidWc2MDNlX2JyZWFrX2lzciAqLworCisKKwwKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNlZSBpZiB0aGUgaGFyZHdhcmUgYnJlYWtwb2ludCBpcyBhdmFpbGFibGUuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK2ludCBiZWRidWc2MDNlX2ZpbmRfZW1wdHkoIHZvaWQgKQoreworICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisgIGlmKCAoR0VUX0lBQlIoKSAmJiAweDAwMDAwMDAyKSA9PSAwICkKKyAgICByZXR1cm4gMTsKKworICByZXR1cm4gMDsKK30gLyogYmVkYnVnNjAzZV9maW5kX2VtcHR5ICovCisKKworDAorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2V0IGEgYnJlYWtwb2ludC4gIElmICd3aGljaF9icCcgaXMgemVybyB0aGVuIGZpbmQgYW4gdW51c2VkIGJyZWFrcG9pbnQKKyAqIG51bWJlciwgb3RoZXJ3aXNlIHJlYXNzaWduIHRoZSBnaXZlbiBicmVha3BvaW50LiAgSWYgaGFyZHdhcmUgZGVidWdnaW5nCisgKiBpcyBub3QgZW5hYmxlZCwgdGhlbiB0dXJuIGl0IG9uIHZpYSB0aGUgTVNSIGFuZCBEQkNSMC4gIFNldCB0aGUgYnJlYWsKKyAqIGFkZHJlc3MgaW4gdGhlIElBQlIgcmVnaXN0ZXIuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK2ludCBiZWRidWc2MDNlX3NldCggaW50IHdoaWNoX2JwLCB1bnNpZ25lZCBsb25nIGFkZHIgKQoreworICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisgIGlmKCggYWRkciAmIDB4MDAwMDAwMDMgKSAhPSAwICkKKyAgeworICAgIHB1dHMgKCAiQnJlYWtwb2ludHMgbXVzdCBiZSBvbiBhIDMyIGJpdCBib3VuZGFyeVxuIiApOworICAgIHJldHVybiAwOworICB9CisKKyAgLyogT25seSBsb29rIGlmIHdoaWNoX2JwID09IDAsIGVsc2UgdXNlIHdoaWNoX2JwICovCisgIGlmKCggYnVnX2N0eC5maW5kX2VtcHR5ICkgJiYgKCAhd2hpY2hfYnAgKSAmJgorICAgICAoIHdoaWNoX2JwID0gKCpidWdfY3R4LmZpbmRfZW1wdHkpKCkpID09IDAgKQorICB7CisgICAgcHV0cyAoICJBbGwgYnJlYWtwb2ludHMgaW4gdXNlXG4iICk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiggd2hpY2hfYnAgPCAxIHx8IHdoaWNoX2JwID4gTUFYX0JSRUFLX1BPSU5UUyApCisgIHsKKyAgICBwcmludGYoICJJbnZhbGlkIGJyZWFrIHBvaW50ICMgJWRcbiIsIHdoaWNoX2JwICk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiggISBidWdfY3R4Lmh3X2RlYnVnX2VuYWJsZWQgKQorICB7CisgICAgYnVnX2N0eC5od19kZWJ1Z19lbmFibGVkID0gMTsKKyAgfQorCisgIFNFVF9JQUJSKCBhZGRyIHwgMHgwMDAwMDAwMiApOworCisgIHJldHVybiB3aGljaF9icDsKK30gLyogYmVkYnVnNjAzZV9zZXQgKi8KKworCisMCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBEaXNhYmxlIGEgc3BlY2lmaWMgYnJlYWtvaW50IGJ5IHNldHRpbmcgdGhlIElBQlIgcmVnaXN0ZXIgdG8gemVyby4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworaW50IGJlZGJ1ZzYwM2VfY2xlYXIoIGludCB3aGljaF9icCApCit7CisgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyAgaWYoIHdoaWNoX2JwIDwgMSB8fCB3aGljaF9icCA+IE1BWF9CUkVBS19QT0lOVFMgKQorICB7CisgICAgcHJpbnRmKCAiSW52YWxpZCBicmVhayBwb2ludCAjICglZClcbiIsIHdoaWNoX2JwICk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgU0VUX0lBQlIoIDAgKTsKKworICByZXR1cm4gMDsKK30gLyogYmVkYnVnNjAzZV9jbGVhciAqLworCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjYwL2NvbW1wcm9jLmMgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgyNjAvY29tbXByb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTFhNjdjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjYwL2NvbW1wcm9jLmMKQEAgLTAsMCArMSwyMjEgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgYmFzZWQgb24gImFyY2gvcG93ZXJwYy84MjYwX2lvL2NvbW1wcm9jLmMiIC0gaGVyZSBpcyBpdCdzCisgKiBjb3B5cmlnaHQgbm90aWNlOgorICoKKyAqIEdlbmVyYWwgUHVycG9zZSBmdW5jdGlvbnMgZm9yIHRoZSBnbG9iYWwgbWFuYWdlbWVudCBvZiB0aGUKKyAqIDgyNjAgQ29tbXVuaWNhdGlvbiBQcm9jZXNzb3IgTW9kdWxlLgorICogQ29weXJpZ2h0IChjKSAxOTk5IERhbiBNYWxlayAoZG1hbGVrQGpsYy5uZXQpCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jIChzb3VyY2VAbXZpc3RhLmNvbSkKKyAqCTIuMy45OSBVcGRhdGVzCisgKgorICogSW4gYWRkaXRpb24gdG8gdGhlIGluZGl2aWR1YWwgY29udHJvbCBvZiB0aGUgY29tbXVuaWNhdGlvbgorICogY2hhbm5lbHMsIHRoZXJlIGFyZSBhIGZldyBmdW5jdGlvbnMgdGhhdCBnbG9iYWxseSBhZmZlY3QgdGhlCisgKiBjb21tdW5pY2F0aW9uIHByb2Nlc3Nvci4KKyAqCisgKiBCdWZmZXIgZGVzY3JpcHRvcnMgbXVzdCBiZSBhbGxvY2F0ZWQgZnJvbSB0aGUgZHVhbCBwb3J0ZWQgbWVtb3J5CisgKiBzcGFjZS4gIFRoZSBhbGxvY2F0b3IgZm9yIHRoYXQgaXMgaGVyZS4gIFdoZW4gdGhlIGNvbW11bmljYXRpb24KKyAqIHByb2Nlc3MgaXMgcmVzZXQsIHdlIHJlY2xhaW0gdGhlIG1lbW9yeSBhdmFpbGFibGUuICBUaGVyZSBpcworICogY3VycmVudGx5IG5vIGRlYWxsb2NhdG9yIGZvciB0aGlzIG1lbW9yeS4KKyAqLworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGFzbS9jcG1fODI2MC5oPgorCitERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKwordm9pZAorbTgyNjBfY3BtX3Jlc2V0KHZvaWQpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tciA9IChpbW1hcF90ICopQ09ORklHX1NZU19JTU1SOworCXZvbGF0aWxlIHVsb25nIGNvdW50OworCisJLyogUmVjbGFpbSB0aGUgRFAgbWVtb3J5IGZvciBvdXIgdXNlLgorCSovCisJZ2QtPmRwX2FsbG9jX2Jhc2UgPSBDUE1fREFUQU9OTFlfQkFTRTsKKwlnZC0+ZHBfYWxsb2NfdG9wID0gZ2QtPmRwX2FsbG9jX2Jhc2UgKyBDUE1fREFUQU9OTFlfU0laRTsKKworCS8qCisJICogUmVzZXQgQ1BNCisJICovCisJaW1tci0+aW1fY3BtLmNwX2NwY3IgPSBDUE1fQ1JfUlNUOworCWNvdW50ID0gMDsKKwlkbyB7CQkJLyogU3BpbiB1bnRpbCBjb21tYW5kIHByb2Nlc3NlZAkJKi8KKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJlaWVpbyIpOworCX0gd2hpbGUgKChpbW1yLT5pbV9jcG0uY3BfY3BjciAmIENQTV9DUl9GTEcpICYmICsrY291bnQgPCAxMDAwMDAwKTsKKworI2lmZGVmIENPTkZJR19IQVJEX0kyQworCSooKHVuc2lnbmVkIHNob3J0KikoJmltbXItPmltX2RwcmFtYmFzZVtQUk9GRl9JMkNfQkFTRV0pKSA9IDA7CisjZW5kaWYKK30KKworLyogQWxsb2NhdGUgc29tZSBtZW1vcnkgZnJvbSB0aGUgZHVhbCBwb3J0ZWQgcmFtLgorICogVG8gaGVscCBwcm90b2NvbHMgd2l0aCBvYmplY3QgYWxpZ25tZW50IHJlc3RyaWN0aW9ucywgd2UgZG8gdGhhdAorICogaWYgdGhleSBhc2suCisgKi8KK3VpbnQKK204MjYwX2NwbV9kcGFsbG9jKHVpbnQgc2l6ZSwgdWludCBhbGlnbikKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1yID0gKGltbWFwX3QgKilDT05GSUdfU1lTX0lNTVI7CisJdWludAlyZXRsb2M7CisJdWludAlhbGlnbl9tYXNrLCBvZmY7CisJdWludAlzYXZlYmFzZTsKKworCWFsaWduX21hc2sgPSBhbGlnbiAtIDE7CisJc2F2ZWJhc2UgPSBnZC0+ZHBfYWxsb2NfYmFzZTsKKworCWlmICgob2ZmID0gKGdkLT5kcF9hbGxvY19iYXNlICYgYWxpZ25fbWFzaykpICE9IDApCisJCWdkLT5kcF9hbGxvY19iYXNlICs9IChhbGlnbiAtIG9mZik7CisKKwlpZiAoKG9mZiA9IHNpemUgJiBhbGlnbl9tYXNrKSAhPSAwKQorCQlzaXplICs9IGFsaWduIC0gb2ZmOworCisJaWYgKChnZC0+ZHBfYWxsb2NfYmFzZSArIHNpemUpID49IGdkLT5kcF9hbGxvY190b3ApIHsKKwkJZ2QtPmRwX2FsbG9jX2Jhc2UgPSBzYXZlYmFzZTsKKwkJcGFuaWMoIm04MjYwX2NwbV9kcGFsbG9jOiByYW4gb3V0IG9mIGR1YWwgcG9ydCByYW0hIik7CisJfQorCisJcmV0bG9jID0gZ2QtPmRwX2FsbG9jX2Jhc2U7CisJZ2QtPmRwX2FsbG9jX2Jhc2UgKz0gc2l6ZTsKKworCW1lbXNldCgodm9pZCAqKSZpbW1yLT5pbV9kcHJhbWJhc2VbcmV0bG9jXSwgMCwgc2l6ZSk7CisKKwlyZXR1cm4ocmV0bG9jKTsKK30KKworLyogV2UgYWxzbyBvd24gb25lIHBhZ2Ugb2YgaG9zdCBidWZmZXIgc3BhY2UgZm9yIHRoZSBhbGxvY2F0aW9uIG9mCisgKiBVQVJUICJmaWZvcyIgYW5kIHRoZSBsaWtlLgorICovCit1aW50CittODI2MF9jcG1faG9zdGFsbG9jKHVpbnQgc2l6ZSwgdWludCBhbGlnbikKK3sKKwkvKiB0aGUgaG9zdCBtaWdodCBub3QgZXZlbiBoYXZlIFJBTSB5ZXQgLSBqdXN0IHVzZSBkdWFsIHBvcnQgUkFNICovCisJcmV0dXJuIChtODI2MF9jcG1fZHBhbGxvYyhzaXplLCBhbGlnbikpOworfQorCisvKiBTZXQgYSBiYXVkIHJhdGUgZ2VuZXJhdG9yLiAgVGhpcyBuZWVkcyBsb3RzIG9mIHdvcmsuICBUaGVyZSBhcmUKKyAqIGVpZ2h0IEJSR3MsIHdoaWNoIGNhbiBiZSBjb25uZWN0ZWQgdG8gdGhlIENQTSBjaGFubmVscyBvciBvdXRwdXQKKyAqIGFzIGNsb2Nrcy4gIFRoZSBCUkdzIGFyZSBpbiB0d28gZGlmZmVyZW50IGJsb2NrIG9mIGludGVybmFsCisgKiBtZW1vcnkgbWFwcGVkIHNwYWNlLgorICogVGhlIGJhdWQgcmF0ZSBjbG9jayBpcyB0aGUgc3lzdGVtIGNsb2NrIGRpdmlkZWQgYnkgc29tZXRoaW5nLgorICogSXQgd2FzIHNldCB1cCBsb25nIGFnbyBkdXJpbmcgdGhlIGluaXRpYWwgYm9vdCBwaGFzZSBhbmQgaXMKKyAqIGlzIGdpdmVuIHRvIHVzLgorICogQmF1ZCByYXRlIGNsb2NrcyBhcmUgemVyby1iYXNlZCBpbiB0aGUgZHJpdmVyIGNvZGUgKGFzIHRoYXQgbWFwcworICogdG8gcG9ydCBudW1iZXJzKS4gIERvY3VtZW50YXRpb24gdXNlcyAxLWJhc2VkIG51bWJlcmluZy4KKyAqLworI2RlZmluZSBCUkdfSU5UX0NMSwlnZC0+YnJnX2NsaworI2RlZmluZSBCUkdfVUFSVF9DTEsJKEJSR19JTlRfQ0xLIC8gMTYpCisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSBVQVJUcywgb3IgYW55dGhpbmcgZWxzZSB0aGF0IHVzZXMgYSAxNngKKyAqIG92ZXJzYW1wbGVkIGNsb2NrLgorICovCit2b2lkCittODI2MF9jcG1fc2V0YnJnKHVpbnQgYnJnLCB1aW50IHJhdGUpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tciA9IChpbW1hcF90ICopQ09ORklHX1NZU19JTU1SOworCXZvbGF0aWxlIHVpbnQJKmJwOworCXVpbnQgY2QgPSBCUkdfVUFSVF9DTEsgLyByYXRlOworCisJaWYgKChCUkdfVUFSVF9DTEsgJSByYXRlKSA8IChyYXRlIC8gMikpCisJCWNkLS07CisJaWYgKGJyZyA8IDQpIHsKKwkJYnAgPSAodWludCAqKSZpbW1yLT5pbV9icmdjMTsKKwl9CisJZWxzZSB7CisJCWJwID0gKHVpbnQgKikmaW1tci0+aW1fYnJnYzU7CisJCWJyZyAtPSA0OworCX0KKwlicCArPSBicmc7CisJKmJwID0gKGNkIDw8IDEpIHwgQ1BNX0JSR19FTjsKK30KKworLyogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNldCBoaWdoIHNwZWVkIHN5bmNocm9ub3VzIGJhdWQgcmF0ZQorICogY2xvY2tzLgorICovCit2b2lkCittODI2MF9jcG1fZmFzdGJyZyh1aW50IGJyZywgdWludCByYXRlLCBpbnQgZGl2MTYpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tciA9IChpbW1hcF90ICopQ09ORklHX1NZU19JTU1SOworCXZvbGF0aWxlIHVpbnQJKmJwOworCisJLyogVGhpcyBpcyBnb29kIGVub3VnaCB0byBnZXQgU01DcyBydW5uaW5nLi4uLi4KKwkqLworCWlmIChicmcgPCA0KSB7CisJCWJwID0gKHVpbnQgKikmaW1tci0+aW1fYnJnYzE7CisJfQorCWVsc2UgeworCQlicCA9ICh1aW50ICopJmltbXItPmltX2JyZ2M1OworCQlicmcgLT0gNDsKKwl9CisJYnAgKz0gYnJnOworCSpicCA9ICgoKCgoQlJHX0lOVF9DTEsrcmF0ZS0xKS9yYXRlKS0xKSYweGZmZik8PDEpfENQTV9CUkdfRU47CisJaWYgKGRpdjE2KQorCQkqYnAgfD0gQ1BNX0JSR19ESVYxNjsKK30KKworLyogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNldCBiYXVkIHJhdGUgZ2VuZXJhdG9ycyB1c2luZyBhbiBleHRlcm5hbAorICogY2xvY2sgc291cmNlIGFuZCAxNnggb3ZlcnNhbXBsaW5nLgorICovCisKK3ZvaWQKK204MjYwX2NwbV9leHRjYnJnKHVpbnQgYnJnLCB1aW50IHJhdGUsIHVpbnQgZXh0Y2xrLCBpbnQgcGluc2VsKQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltbXIgPSAoaW1tYXBfdCAqKUNPTkZJR19TWVNfSU1NUjsKKwl2b2xhdGlsZSB1aW50CSpicDsKKworCWlmIChicmcgPCA0KSB7CisJCWJwID0gKHVpbnQgKikmaW1tci0+aW1fYnJnYzE7CisJfQorCWVsc2UgeworCQlicCA9ICh1aW50ICopJmltbXItPmltX2JyZ2M1OworCQlicmcgLT0gNDsKKwl9CisJYnAgKz0gYnJnOworCSpicCA9ICgoKCgoKGV4dGNsay8xNikrcmF0ZS0xKS9yYXRlKS0xKSYweGZmZik8PDEpfENQTV9CUkdfRU47CisJaWYgKHBpbnNlbCA9PSAwKQorCQkqYnAgfD0gQ1BNX0JSR19FWFRDX0NMSzNfOTsKKwllbHNlCisJCSpicCB8PSBDUE1fQlJHX0VYVENfQ0xLNV8xNTsKK30KKworI2lmIGRlZmluZWQoQ09ORklHX1BPU1QpIHx8IGRlZmluZWQoQ09ORklHX0xPR0JVRkZFUikKKwordm9pZCBwb3N0X3dvcmRfc3RvcmUgKHVsb25nIGEpCit7CisJdm9sYXRpbGUgdWxvbmcgKnNhdmVfYWRkciA9CisJCSh2b2xhdGlsZSB1bG9uZyAqKShDT05GSUdfU1lTX0lNTVIgKyBDUE1fUE9TVF9XT1JEX0FERFIpOworCisJKnNhdmVfYWRkciA9IGE7Cit9CisKK3Vsb25nIHBvc3Rfd29yZF9sb2FkICh2b2lkKQoreworCXZvbGF0aWxlIHVsb25nICpzYXZlX2FkZHIgPQorCQkodm9sYXRpbGUgdWxvbmcgKikoQ09ORklHX1NZU19JTU1SICsgQ1BNX1BPU1RfV09SRF9BRERSKTsKKworCXJldHVybiAqc2F2ZV9hZGRyOworfQorCisjZW5kaWYJLyogQ09ORklHX1BPU1QgfHwgQ09ORklHX0xPR0JVRkZFUiovCisKKyNpZmRlZiBDT05GSUdfQk9PVENPVU5UX0xJTUlUCisKK3ZvaWQgYm9vdGNvdW50X3N0b3JlICh1bG9uZyBhKQoreworCXZvbGF0aWxlIHVsb25nICpzYXZlX2FkZHIgPQorCQkodm9sYXRpbGUgdWxvbmcgKikoQ09ORklHX1NZU19JTU1SICsgQ1BNX0JPT1RDT1VOVF9BRERSKTsKKworCXNhdmVfYWRkclswXSA9IGE7CisJc2F2ZV9hZGRyWzFdID0gQk9PVENPVU5UX01BR0lDOworfQorCit1bG9uZyBib290Y291bnRfbG9hZCAodm9pZCkKK3sKKwl2b2xhdGlsZSB1bG9uZyAqc2F2ZV9hZGRyID0KKwkJKHZvbGF0aWxlIHVsb25nICopKENPTkZJR19TWVNfSU1NUiArIENQTV9CT09UQ09VTlRfQUREUik7CisKKwlpZiAoc2F2ZV9hZGRyWzFdICE9IEJPT1RDT1VOVF9NQUdJQykKKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4gc2F2ZV9hZGRyWzBdOworfQorCisjZW5kaWYgLyogQ09ORklHX0JPT1RDT1VOVF9MSU1JVCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjYwL2NvbmZpZy5tayBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI2MC9jb25maWcubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTliYjY4OAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI2MC9jb25maWcubWsKQEAgLTAsMCArMSwzMCBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDAKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworUExBVEZPUk1fUkVMRkxBR1MgKz0gLWZQSUMgLW1lYWJpCisKK1BMQVRGT1JNX0NQUEZMQUdTICs9IC1EQ09ORklHXzgyNjAgLURDT05GSUdfQ1BNMiAtZmZpeGVkLXIyIFwKKwkJICAgICAtbXN0cmluZyAtbWNwdT02MDNlIC1tbXVsdGlwbGUKKworIyBVc2UgZGVmYXVsdCBsaW5rZXIgc2NyaXB0LiAgQm9hcmQgcG9ydCBjYW4gb3ZlcnJpZGUgaW4gYm9hcmQvKi9jb25maWcubWsKK0xEU0NSSVBUIDo9ICQoU1JDVFJFRSkvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjYwL3UtYm9vdC5sZHMKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI2MC9jcHUuYyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI2MC9jcHUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWRiZjI5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjYwL2NwdS5jCkBAIC0wLDAgKzEsMzM4IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAwLTIwMDYKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyoKKyAqIENQVSBzcGVjaWZpYyBjb2RlIGZvciB0aGUgTVBDODI1eCAvIE1QQzgyNnggLyBNUEM4Mjd4IC8gTVBDODI4eAorICoKKyAqIHdyaXR0ZW4gb3IgY29sbGVjdGVkIGFuZCBzb21ldGltZXMgcmV3cml0dGVuIGJ5CisgKiBNYWdudXMgRGFtbSA8ZGFtbUBiaXRzbWFydC5jb20+CisgKgorICogbW9kaWZpZWQgYnkKKyAqIFdvbGZnYW5nIERlbmsgPHdkQGRlbnguZGU+CisgKgorICogbW9kaWZpZWQgZm9yIDgyNjAgYnkKKyAqIE11cnJheSBKZW5zZW4gPE11cnJheS5KZW5zZW5AY21zdC5jc2lyby5hdT4KKyAqCisgKiBhZGRlZCA4MjYwIG1hc2tzIGJ5CisgKiBNYXJpdXMgR3JvZWdlciA8bWFnQHN5c2dvLmRlPgorICoKKyAqIGFkZGVkIEhpUDcgKDgyNHgvODI3eC84MjgwKSBwcm9jZXNzb3JzIHN1cHBvcnQgYnkKKyAqIFl1bGkgQmFyY29oZW4gPHl1bGlAYXJhYmVsbGFzdy5jb20+CisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPHdhdGNoZG9nLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPG1wYzgyNjAuaD4KKyNpbmNsdWRlIDxuZXRkZXYuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL2NwbV84MjYwLmg+CisKKyNpZiBkZWZpbmVkKENPTkZJR19PRl9MSUJGRFQpCisjaW5jbHVkZSA8bGliZmR0Lmg+CisjaW5jbHVkZSA8bGliZmR0X2Vudi5oPgorI2luY2x1ZGUgPGZkdF9zdXBwb3J0Lmg+CisjZW5kaWYKKworREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKyNpZiBkZWZpbmVkKENPTkZJR19HRVRfQ1BVX1NUUl9GKQorZXh0ZXJuIGludCBnZXRfY3B1X3N0cl9mIChjaGFyICpidWYpOworI2VuZGlmCisKK2ludCBjaGVja2NwdSAodm9pZCkKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1hcCA9IChpbW1hcF90ICopIENPTkZJR19TWVNfSU1NUjsKKwl1bG9uZyBjbG9jayA9IGdkLT5jcHVfY2xrOworCXVpbnQgcHZyID0gZ2V0X3B2ciAoKTsKKwl1aW50IGltbXIsIHJldiwgbSwgazsKKwljaGFyIGJ1ZlszMl07CisKKwlwdXRzICgiQ1BVOiAgICIpOworCisJc3dpdGNoIChwdnIpIHsKKwljYXNlIFBWUl84MjYwOgorCWNhc2UgUFZSXzgyNjBfSElQMzoKKwkJayA9IDM7CisJCWJyZWFrOworCWNhc2UgUFZSXzgyNjBfSElQNDoKKwkJayA9IDQ7CisJCWJyZWFrOworCWNhc2UgUFZSXzgyNjBfSElQN1IxOgorCWNhc2UgUFZSXzgyNjBfSElQN1JBOgorCWNhc2UgUFZSXzgyNjBfSElQNzoKKwkJayA9IDc7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtMTsJLyogd2hvb3BzISBub3QgYW4gTVBDODI2MCAqLworCX0KKwlyZXYgPSBwdnIgJiAweGZmOworCisJaW1tciA9IGltbWFwLT5pbV9tZW1jdGwubWVtY19pbW1yOworCWlmICgoaW1tciAmIElNTVJfSVNCX01TSykgIT0gQ09ORklHX1NZU19JTU1SKQorCQlyZXR1cm4gLTE7CS8qIHdob29wcyEgc29tZW9uZSBtb3ZlZCB0aGUgSU1NUiAqLworCisjaWYgZGVmaW5lZChDT05GSUdfR0VUX0NQVV9TVFJfRikKKwlnZXRfY3B1X3N0cl9mIChidWYpOworCXByaW50ZiAoIiVzIChIaVAlZCBSZXYgJTAyeCwgTWFzayAiLCBidWYsIGssIHJldik7CisjZWxzZQorCXByaW50ZiAoQ1BVX0lEX1NUUiAiIChIaVAlZCBSZXYgJTAyeCwgTWFzayAiLCBrLCByZXYpOworI2VuZGlmCisKKwkvKgorCSAqIHRoZSBib3R0b20gMTYgYml0cyBvZiB0aGUgaW1tciBhcmUgdGhlIFBhcnQgTnVtYmVyIGFuZCBNYXNrIE51bWJlcgorCSAqICg0LTM0KTsgdGhlIDE2IGJpdHMgYXQgUFJPRkZfUkVWTlVNICgweDhhZjApIGluIGR1YWwgcG9ydCByYW0gaXMgdGhlCisJICogUklTQyBNaWNyb2NvZGUgUmV2aXNpb24gTnVtYmVyICgxMy0xMCkuCisJICogRm9yIHRoZSA4MjYwLCBNb3Rvcm9sYSBkb2Vzbid0IGluY2x1ZGUgdGhlIE1pY3JvY29kZSBSZXZpc2lvbgorCSAqIGluIHRoZSBtYXNrLgorCSAqLworCW0gPSBpbW1yICYgKElNTVJfUEFSVE5VTV9NU0sgfCBJTU1SX01BU0tOVU1fTVNLKTsKKwlrID0gKigodXNob3J0ICopICYgaW1tYXAtPmltX2RwcmFtYmFzZVtQUk9GRl9SRVZOVU1dKTsKKworCXN3aXRjaCAobSkgeworCWNhc2UgMHgwMDAwOgorCQlwdXRzICgiMC4yIDJKMjRNIik7CisJCWJyZWFrOworCWNhc2UgMHgwMDEwOgorCQlwdXRzICgiQS4wIEsyMkEiKTsKKwkJYnJlYWs7CisJY2FzZSAweDAwMTE6CisJCXB1dHMgKCJBLjEgMUsyMkEtWEMiKTsKKwkJYnJlYWs7CisJY2FzZSAweDAwMDE6CisJCXB1dHMgKCJCLjEgMUsyM0EiKTsKKwkJYnJlYWs7CisJY2FzZSAweDAwMjE6CisJCXB1dHMgKCJCLjIgMksyM0EtWEMiKTsKKwkJYnJlYWs7CisJY2FzZSAweDAwMjM6CisJCXB1dHMgKCJCLjMgM0syM0EiKTsKKwkJYnJlYWs7CisJY2FzZSAweDAwMjQ6CisJCXB1dHMgKCJDLjIgNksyM0EiKTsKKwkJYnJlYWs7CisJY2FzZSAweDAwNjA6CisJCXB1dHMgKCJBLjAoQSkgMksyNUEiKTsKKwkJYnJlYWs7CisJY2FzZSAweDAwNjI6CisJCXB1dHMgKCJCLjEgNEsyNUEiKTsKKwkJYnJlYWs7CisJY2FzZSAweDAwNjQ6CisJCXB1dHMgKCJDLjAgNUsyNUEiKTsKKwkJYnJlYWs7CisJY2FzZSAweDBBMDA6CisJCXB1dHMgKCIwLjAgMEs0OU0iKTsKKwkJYnJlYWs7CisJY2FzZSAweDBBMDE6CisJCXB1dHMgKCIwLjEgMUs0OU0iKTsKKwkJYnJlYWs7CisJY2FzZSAweDBBMTA6CisJCXB1dHMgKCIxLjAgMUs0OU0iKTsKKwkJYnJlYWs7CisJY2FzZSAweDBDMDA6CisJCXB1dHMgKCIwLjAgMEs1ME0iKTsKKwkJYnJlYWs7CisJY2FzZSAweDBDMTA6CisJCXB1dHMgKCIxLjAgMUs1ME0iKTsKKwkJYnJlYWs7CisJY2FzZSAweDBEMDA6CisJCXB1dHMgKCIwLjAgMEs1ME0iKTsKKwkJYnJlYWs7CisJY2FzZSAweDBEMTA6CisJCXB1dHMgKCIxLjAgMUs1ME0iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRmICgidW5rbm93biBbaW1tcj0weCUwNHgsaz0weCUwNHhdIiwgbSwgayk7CisJCWJyZWFrOworCX0KKworCXByaW50ZiAoIikgYXQgJXMgTUh6XG4iLCBzdHJtaHogKGJ1ZiwgY2xvY2spKTsKKworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBjb25maWd1cmVzIGEgVVBNIGJ5IHdyaXRpbmcgaW50byB0aGUgVVBNIFJBTSBhcnJheQkJCSAgICAgKi8KKy8qIHVzZXMgYmFuayAxMSBhbmQgYSBkdW1teSBwaHlzaWNhbCBhZGRyZXNzICg9QlJ4X0JBX01TSykJCSAgICAgKi8KKy8qIE5PVEU6IHRoZSBwaHlzaWNhbCBhZGRyZXNzIGNob3NlbiBtdXN0IG5vdCBvdmVybGFwIGludG8gYW55IG90aGVyIGFyZWEgICAgKi8KKy8qIG1hcHBlZCBieSB0aGUgbWVtb3J5IGNvbnRyb2xsZXIgYmVjYXVzZSBiYW5rIDExIGhhcyB0aGUgbG93ZXN0IHByaW9yaXR5ICAgKi8KKwordm9pZCB1cG1jb25maWcgKHVpbnQgdXBtLCB1aW50ICogdGFibGUsIHVpbnQgc2l6ZSkKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1hcCA9IChpbW1hcF90ICopIENPTkZJR19TWVNfSU1NUjsKKwl2b2xhdGlsZSBtZW1jdGw4MjYwX3QgKm1lbWN0bCA9ICZpbW1hcC0+aW1fbWVtY3RsOworCXZvbGF0aWxlIHVjaGFyICpkdW1teSA9ICh1Y2hhciAqKSBCUnhfQkFfTVNLOwkvKiBzZXQgYWxsIEJBIGJpdHMgKi8KKwl1aW50IGk7CisKKwkvKiBmaXJzdCBzZXQgdXAgYmFuayAxMSB0byByZWZlcmVuY2UgdGhlIGNvcnJlY3QgVVBNIGF0IGEgZHVtbXkgYWRkcmVzcyAqLworCisJbWVtY3RsLT5tZW1jX29yMTEgPSBPUnhVX0FNX01TSzsJLyogc2V0IGFsbCBBTSBiaXRzICovCisKKwlzd2l0Y2ggKHVwbSkgeworCisJY2FzZSBVUE1BOgorCQltZW1jdGwtPm1lbWNfYnIxMSA9CisJCQkoKHVpbnQpZHVtbXkgJiBCUnhfQkFfTVNLKSB8IEJSeF9QU18zMiB8IEJSeF9NU19VUE1BIHwKKwkJCUJSeF9WOworCQltZW1jdGwtPm1lbWNfbWFtciA9IE14TVJfT1BfV0FSUjsKKwkJYnJlYWs7CisKKwljYXNlIFVQTUI6CisJCW1lbWN0bC0+bWVtY19icjExID0KKwkJCSgodWludClkdW1teSAmIEJSeF9CQV9NU0spIHwgQlJ4X1BTXzMyIHwgQlJ4X01TX1VQTUIgfAorCQkJQlJ4X1Y7CisJCW1lbWN0bC0+bWVtY19tYm1yID0gTXhNUl9PUF9XQVJSOworCQlicmVhazsKKworCWNhc2UgVVBNQzoKKwkJbWVtY3RsLT5tZW1jX2JyMTEgPQorCQkJKCh1aW50KWR1bW15ICYgQlJ4X0JBX01TSykgfCBCUnhfUFNfMzIgfCBCUnhfTVNfVVBNQyB8CisJCQlCUnhfVjsKKwkJbWVtY3RsLT5tZW1jX21jbXIgPSBNeE1SX09QX1dBUlI7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcGFuaWMgKCJ1cG1jb25maWcgcGFzc2VkIGludmFsaWQgVVBNIG51bWJlciAoJXUpXG4iLCB1cG0pOworCQlicmVhazsKKworCX0KKworCS8qCisJICogYXQgdGhpcyBwb2ludCwgdGhlIGR1bW15IGFkZHJlc3MgaXMgc2V0IHVwIHRvIGFjY2VzcyB0aGUgc2VsZWN0ZWQgVVBNLAorCSAqIHRoZSBNQUQgcG9pbnRlciBpcyB6ZXJvLCBhbmQgdGhlIE14TVIgT1AgaXMgc2V0IGZvciB3cml0aW5nIHRvIFJBTQorCSAqCisJICogbm93IHdlIHNpbXBseSBsb2FkIHRoZSBtZHIgd2l0aCBlYWNoIHdvcmQgYW5kIHBva2UgdGhlIGR1bW15IGFkZHJlc3MuCisJICogdGhlIE1BRCBpcyBpbmNyZW1lbnRlZCBvbiBlYWNoIGFjY2Vzcy4KKwkgKi8KKworCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJbWVtY3RsLT5tZW1jX21kciA9IHRhYmxlW2ldOworCQkqZHVtbXkgPSAwOworCX0KKworCS8qIG5vdyBraWxsIGJhbmsgMTEgKi8KKwltZW1jdGwtPm1lbWNfYnIxMSA9IDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmICFkZWZpbmVkKENPTkZJR19IQVZFX09XTl9SRVNFVCkKK2ludAorZG9fcmVzZXQgKGNtZF90YmxfdCAqIGNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwl1bG9uZyBtc3IsIGFkZHI7CisKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1hcCA9IChpbW1hcF90ICopIENPTkZJR19TWVNfSU1NUjsKKworCWltbWFwLT5pbV9jbGtyc3QuY2FyX3JtciA9IFJNUl9DU1JFOwkvKiBDaGVja3N0b3AgUmVzZXQgZW5hYmxlICovCisKKwkvKiBJbnRlcnJ1cHRzIGFuZCBNTVUgb2ZmICovCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtZm1zciAgICAlMCI6Ij1yIiAobXNyKTopOworCisJbXNyICY9IH4oTVNSX01FIHwgTVNSX0VFIHwgTVNSX0lSIHwgTVNSX0RSKTsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm10bXNyICAgICUwIjo6InIiIChtc3IpKTsKKworCS8qCisJICogVHJ5aW5nIHRvIGV4ZWN1dGUgdGhlIG5leHQgaW5zdHJ1Y3Rpb24gYXQgYSBub24tZXhpc3RpbmcgYWRkcmVzcworCSAqIHNob3VsZCBjYXVzZSBhIG1hY2hpbmUgY2hlY2ssIHJlc3VsdGluZyBpbiByZXNldAorCSAqLworI2lmZGVmIENPTkZJR19TWVNfUkVTRVRfQUREUkVTUworCWFkZHIgPSBDT05GSUdfU1lTX1JFU0VUX0FERFJFU1M7CisjZWxzZQorCS8qCisJICogbm90ZTogd2hlbiBDT05GSUdfU1lTX01PTklUT1JfQkFTRSBwb2ludHMgdG8gYSBSQU0gYWRkcmVzcywgQ09ORklHX1NZU19NT05JVE9SX0JBU0UKKwkgKiAtIHNpemVvZiAodWxvbmcpIGlzIHVzdWFsbHkgYSB2YWxpZCBhZGRyZXNzLiBCZXR0ZXIgcGljayBhbiBhZGRyZXNzCisJICoga25vd24gdG8gYmUgaW52YWxpZCBvbiB5b3VyIHN5c3RlbSBhbmQgYXNzaWduIGl0IHRvIENPTkZJR19TWVNfUkVTRVRfQUREUkVTUy4KKwkgKi8KKwlhZGRyID0gQ09ORklHX1NZU19NT05JVE9SX0JBU0UgLSBzaXplb2YgKHVsb25nKTsKKyNlbmRpZgorCSgodm9pZCAoKikodm9pZCkpIGFkZHIpICgpOworCXJldHVybiAxOworCit9CisjZW5kaWYJLyogQ09ORklHX0hBVkVfT1dOX1JFU0VUICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIEdldCB0aW1lYmFzZSBjbG9jayBmcmVxdWVuY3kgKGxpa2UgY3B1X2NsayBpbiBIeikKKyAqCisgKi8KK3Vuc2lnbmVkIGxvbmcgZ2V0X3RiY2xrICh2b2lkKQoreworCXVsb25nIHRiY2xrOworCisJdGJjbGsgPSAoZ2QtPmJ1c19jbGsgKyAzTCkgLyA0TDsKKworCXJldHVybiAodGJjbGspOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19XQVRDSERPRykKK3ZvaWQgd2F0Y2hkb2dfcmVzZXQgKHZvaWQpCit7CisJaW50IHJlX2VuYWJsZSA9IGRpc2FibGVfaW50ZXJydXB0cyAoKTsKKworCXJlc2V0XzgyNjBfd2F0Y2hkb2cgKChpbW1hcF90ICopIENPTkZJR19TWVNfSU1NUik7CisJaWYgKHJlX2VuYWJsZSkKKwkJZW5hYmxlX2ludGVycnVwdHMgKCk7Cit9CisjZW5kaWYgLyogQ09ORklHX1dBVENIRE9HICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNpZiBkZWZpbmVkKENPTkZJR19PRl9MSUJGRFQpICYmIGRlZmluZWQgKENPTkZJR19PRl9CT0FSRF9TRVRVUCkKK3ZvaWQgZnRfY3B1X3NldHVwICh2b2lkICpibG9iLCBiZF90ICpiZCkKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19IQVNfRVRIMCkgfHwgZGVmaW5lZChDT05GSUdfSEFTX0VUSDEpIHx8XAorICAgIGRlZmluZWQoQ09ORklHX0hBU19FVEgyKSB8fCBkZWZpbmVkKENPTkZJR19IQVNfRVRIMykKKwlmZHRfZml4dXBfZXRoZXJuZXQoYmxvYik7CisjZW5kaWYKKworCWRvX2ZpeHVwX2J5X2NvbXBhdF91MzIoYmxvYiwgImZzbCxjcG0yLWJyZyIsCisJCQkgICAgICAgImNsb2NrLWZyZXF1ZW5jeSIsIGJkLT5iaV9icmdmcmVxLCAxKTsKKworCWRvX2ZpeHVwX2J5X3Byb3BfdTMyKGJsb2IsICJkZXZpY2VfdHlwZSIsICJjcHUiLCA0LAorCQkiYnVzLWZyZXF1ZW5jeSIsIGJkLT5iaV9idXNmcmVxLCAxKTsKKwlkb19maXh1cF9ieV9wcm9wX3UzMihibG9iLCAiZGV2aWNlX3R5cGUiLCAiY3B1IiwgNCwKKwkJInRpbWViYXNlLWZyZXF1ZW5jeSIsIE9GX1RCQ0xLLCAxKTsKKwlkb19maXh1cF9ieV9wcm9wX3UzMihibG9iLCAiZGV2aWNlX3R5cGUiLCAiY3B1IiwgNCwKKwkJImNsb2NrLWZyZXF1ZW5jeSIsIGJkLT5iaV9pbnRmcmVxLCAxKTsKKwlmZHRfZml4dXBfbWVtb3J5KGJsb2IsICh1NjQpYmQtPmJpX21lbXN0YXJ0LCAodTY0KWJkLT5iaV9tZW1zaXplKTsKK30KKyNlbmRpZiAvKiBDT05GSUdfT0ZfTElCRkRUICovCisKKy8qCisgKiBJbml0aWFsaXplcyBvbi1jaGlwIGV0aGVybmV0IGNvbnRyb2xsZXJzLgorICogdG8gb3ZlcnJpZGUsIGltcGxlbWVudCBib2FyZF9ldGhfaW5pdCgpCisgKi8KK2ludCBjcHVfZXRoX2luaXQoYmRfdCAqYmlzKQoreworI2lmIGRlZmluZWQoQ09ORklHX0VUSEVSX09OX0ZDQykKKwlmZWNfaW5pdGlhbGl6ZShiaXMpOworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfRVRIRVJfT05fU0NDKQorCW1wYzgyeHhfc2NjX2VuZXRfaW5pdGlhbGl6ZShiaXMpOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzgyNjAvY3B1X2luaXQuYyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI2MC9jcHVfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNTI3NzMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgyNjAvY3B1X2luaXQuYwpAQCAtMCwwICsxLDI5MiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMC0yMDAyCisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxtcGM4MjYwLmg+CisjaW5jbHVkZSA8YXNtL2NwbV84MjYwLmg+CisjaW5jbHVkZSA8aW9wb3J0cy5oPgorCitERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworI2lmIGRlZmluZWQoQ09ORklHX0JPQVJEX0dFVF9DUFVfQ0xLX0YpCitleHRlcm4gdW5zaWduZWQgbG9uZyBib2FyZF9nZXRfY3B1X2Nsa19mICh2b2lkKTsKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBjb25maWdfODI2MF9pb3BvcnRzICh2b2xhdGlsZSBpbW1hcF90ICogaW1tcikKK3sKKwlpbnQgcG9ydG51bTsKKworCWZvciAocG9ydG51bSA9IDA7IHBvcnRudW0gPCA0OyBwb3J0bnVtKyspIHsKKwkJdWludCBwbXNrID0gMCwKKwkJICAgICBwcGFyID0gMCwKKwkJICAgICBwc29yID0gMCwKKwkJICAgICBwZGlyID0gMCwKKwkJICAgICBwb2RyID0gMCwKKwkJICAgICBwZGF0ID0gMDsKKwkJaW9wX2NvbmZfdCAqaW9wYyA9IChpb3BfY29uZl90ICopICYgaW9wX2NvbmZfdGFiW3BvcnRudW1dWzBdOworCQlpb3BfY29uZl90ICplaW9wYyA9IGlvcGMgKyAzMjsKKwkJdWludCBtc2sgPSAxOworCisJCS8qCisJCSAqIE5PVEU6CisJCSAqIGluZGV4IDAgcmVmZXJzIHRvIHBpbiAzMSwKKwkJICogaW5kZXggMzEgcmVmZXJzIHRvIHBpbiAwCisJCSAqLworCQl3aGlsZSAoaW9wYyA8IGVpb3BjKSB7CisJCQlpZiAoaW9wYy0+Y29uZikgeworCQkJCXBtc2sgfD0gbXNrOworCQkJCWlmIChpb3BjLT5wcGFyKQorCQkJCQlwcGFyIHw9IG1zazsKKwkJCQlpZiAoaW9wYy0+cHNvcikKKwkJCQkJcHNvciB8PSBtc2s7CisJCQkJaWYgKGlvcGMtPnBkaXIpCisJCQkJCXBkaXIgfD0gbXNrOworCQkJCWlmIChpb3BjLT5wb2RyKQorCQkJCQlwb2RyIHw9IG1zazsKKwkJCQlpZiAoaW9wYy0+cGRhdCkKKwkJCQkJcGRhdCB8PSBtc2s7CisJCQl9CisKKwkJCW1zayA8PD0gMTsKKwkJCWlvcGMrKzsKKwkJfQorCisJCWlmIChwbXNrICE9IDApIHsKKwkJCXZvbGF0aWxlIGlvcG9ydF90ICppb3AgPSBpb3BvcnRfYWRkciAoaW1tciwgcG9ydG51bSk7CisJCQl1aW50IHRwbXNrID0gfnBtc2s7CisKKwkJCS8qCisJCQkgKiB0aGUgKHNvbWV3aGF0IGNvbmZ1c2VkKSBwYXJhZ3JhcGggYXQgdGhlCisJCQkgKiBib3R0b20gb2YgcGFnZSAzNS01IHdhcm5zIHRoYXQgdGhlcmUgbWlnaHQKKwkJCSAqIGJlICJ1bmtub3duIGJlaGF2aW91ciIgd2hlbiBwcm9ncmFtbWluZworCQkJICogUFNPUnggYW5kIFBESVJ4LCBpZiBQUEFSeCA9IDEsIHNvIEkKKwkJCSAqIGRlY2lkZWQgdGhpcyBtZWFudCBJIGhhZCB0byBkaXNhYmxlIHRoZQorCQkJICogZGVkaWNhdGVkIGZ1bmN0aW9uIGZpcnN0LCBhbmQgZW5hYmxlIGl0CisJCQkgKiBsYXN0LgorCQkJICovCisJCQlpb3AtPnBwYXIgJj0gdHBtc2s7CisJCQlpb3AtPnBzb3IgPSAoaW9wLT5wc29yICYgdHBtc2spIHwgcHNvcjsKKwkJCWlvcC0+cG9kciA9IChpb3AtPnBvZHIgJiB0cG1zaykgfCBwb2RyOworCQkJaW9wLT5wZGF0ID0gKGlvcC0+cGRhdCAmIHRwbXNrKSB8IHBkYXQ7CisJCQlpb3AtPnBkaXIgPSAoaW9wLT5wZGlyICYgdHBtc2spIHwgcGRpcjsKKwkJCWlvcC0+cHBhciB8PSBwcGFyOworCQl9CisJfQorfQorCisjZGVmaW5lIFNFVF9WQUxfTUFTSyhhLCBiLCBtYXNrKSAoKGEgJiBtYXNrKSB8IChiICYgfm1hc2spKQorLyoKKyAqIEJyZWF0aCBzb21lIGxpZmUgaW50byB0aGUgQ1BVLi4uCisgKgorICogU2V0IHVwIHRoZSBtZW1vcnkgbWFwLAorICogaW5pdGlhbGl6ZSBhIGJ1bmNoIG9mIHJlZ2lzdGVycywKKyAqIGluaXRpYWxpemUgdGhlIFVQTSdzCisgKi8KK3ZvaWQgY3B1X2luaXRfZiAodm9sYXRpbGUgaW1tYXBfdCAqIGltbXIpCit7CisjaWYgIWRlZmluZWQoQ09ORklHX0NPR0VOVCkJCS8qIGRvbmUgaW4gc3RhcnQuUyBmb3IgdGhlIGNvZ2VudCAqLworCXVpbnQgc2NjcjsKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX0JPQVJEX0dFVF9DUFVfQ0xLX0YpCisJdW5zaWduZWQgbG9uZyBjcHVfY2xrOworI2VuZGlmCisJdm9sYXRpbGUgbWVtY3RsODI2MF90ICptZW1jdGwgPSAmaW1tci0+aW1fbWVtY3RsOworCWV4dGVybiB2b2lkIG04MjYwX2NwbV9yZXNldCAodm9pZCk7CisKKwkvKiBQb2ludGVyIGlzIHdyaXRhYmxlIHNpbmNlIHdlIGFsbG9jYXRlZCBhIHJlZ2lzdGVyIGZvciBpdCAqLworCWdkID0gKGdkX3QgKikgKENPTkZJR19TWVNfSU5JVF9SQU1fQUREUiArIENPTkZJR19TWVNfR0JMX0RBVEFfT0ZGU0VUKTsKKworCS8qIENsZWFyIGluaXRpYWwgZ2xvYmFsIGRhdGEgKi8KKwltZW1zZXQgKCh2b2lkICopIGdkLCAwLCBzaXplb2YgKGdkX3QpKTsKKworCS8qIFJTUiAtIFJlc2V0IFN0YXR1cyBSZWdpc3RlciAtIGNsZWFyIGFsbCBzdGF0dXMgKDUtNCkgKi8KKwlnZC0+cmVzZXRfc3RhdHVzID0gaW1tci0+aW1fY2xrcnN0LmNhcl9yc3I7CisJaW1tci0+aW1fY2xrcnN0LmNhcl9yc3IgPSBSU1JfQUxMQklUUzsKKworCS8qIFJNUiAtIFJlc2V0IE1vZGUgUmVnaXN0ZXIgLSBjb250YWlucyBjaGVja3N0b3AgcmVzZXQgZW5hYmxlICg1LTUpICovCisJaW1tci0+aW1fY2xrcnN0LmNhcl9ybXIgPSBDT05GSUdfU1lTX1JNUjsKKworCS8qIEJDUiAtIEJ1cyBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICg0LTI1KSAqLworI2lmIGRlZmluZWQoQ09ORklHX1NZU19CQ1JfNjB4KSAmJiAoQ09ORklHX1NZU19CQ1JfU0lOR0xFKQorCWlmIChpbW1yLT5pbV9zaXVfY29uZi5zY19iY3IgJiBCQ1JfRUJNKSB7CisJCWltbXItPmltX3NpdV9jb25mLnNjX2JjciA9IFNFVF9WQUxfTUFTSyhpbW1yLT5pbV9zaXVfY29uZi5zY19iY3IsIENPTkZJR19TWVNfQkNSXzYweCwgMHg4MDAwMDAxMCk7CisJfSBlbHNlIHsKKwkJaW1tci0+aW1fc2l1X2NvbmYuc2NfYmNyID0gU0VUX1ZBTF9NQVNLKGltbXItPmltX3NpdV9jb25mLnNjX2JjciwgQ09ORklHX1NZU19CQ1JfU0lOR0xFLCAweDgwMDAwMDEwKTsKKwl9CisjZWxzZQorCWltbXItPmltX3NpdV9jb25mLnNjX2JjciA9IENPTkZJR19TWVNfQkNSOworI2VuZGlmCisKKwkvKiBTSVVNQ1IgLSBjb250YWlucyBkZWJ1ZyBwaW4gY29uZmlndXJhdGlvbiAoNC0zMSkgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfU0lVTUNSX0xPVykgJiYgKENPTkZJR19TWVNfU0lVTUNSX0hJR0gpCisJY3B1X2NsayA9IGJvYXJkX2dldF9jcHVfY2xrX2YgKCk7CisJaWYgKGNwdV9jbGsgPj0gMTAwMDAwMDAwKSB7CisJCWltbXItPmltX3NpdV9jb25mLnNjX3NpdW1jciA9IFNFVF9WQUxfTUFTSyhpbW1yLT5pbV9zaXVfY29uZi5zY19zaXVtY3IsIENPTkZJR19TWVNfU0lVTUNSX0hJR0gsIDB4OWYzY2MwMDApOworCX0gZWxzZSB7CisJCWltbXItPmltX3NpdV9jb25mLnNjX3NpdW1jciA9IFNFVF9WQUxfTUFTSyhpbW1yLT5pbV9zaXVfY29uZi5zY19zaXVtY3IsIENPTkZJR19TWVNfU0lVTUNSX0xPVywgMHg5ZjNjYzAwMCk7CisJfQorI2Vsc2UKKwlpbW1yLT5pbV9zaXVfY29uZi5zY19zaXVtY3IgPSBDT05GSUdfU1lTX1NJVU1DUjsKKyNlbmRpZgorCisJY29uZmlnXzgyNjBfaW9wb3J0cyAoaW1tcik7CisKKwkvKiBpbml0aWFsaXplIHRpbWUgY291bnRlciBzdGF0dXMgYW5kIGNvbnRyb2wgcmVnaXN0ZXIgKDQtNDApICovCisJaW1tci0+aW1fc2l0LnNpdF90bWNudHNjID0gQ09ORklHX1NZU19UTUNOVFNDOworCisJLyogaW5pdGlhbGl6ZSB0aGUgUElUICg0LTQyKSAqLworCWltbXItPmltX3NpdC5zaXRfcGlzY3IgPSBDT05GSUdfU1lTX1BJU0NSOworCisjaWYgIWRlZmluZWQoQ09ORklHX0NPR0VOVCkJCS8qIGRvbmUgaW4gc3RhcnQuUyBmb3IgdGhlIGNvZ2VudCAqLworCS8qIFN5c3RlbSBjbG9jayBjb250cm9sIHJlZ2lzdGVyICg5LTgpICovCisJc2NjciA9IGltbXItPmltX2Nsa3JzdC5jYXJfc2NjciAmCisJCShTQ0NSX1BDSV9NT0RFIHwgU0NDUl9QQ0lfTU9EQ0sgfCBTQ0NSX1BDSURGX01TSyk7CisJaW1tci0+aW1fY2xrcnN0LmNhcl9zY2NyID0gc2NjciB8CisJCShDT05GSUdfU1lTX1NDQ1IgJiB+KFNDQ1JfUENJX01PREUgfCBTQ0NSX1BDSV9NT0RDSyB8IFNDQ1JfUENJREZfTVNLKSApOworI2VuZGlmIC8qICFDT05GSUdfQ09HRU5UICovCisKKwkvKgorCSAqIE1lbW9yeSBDb250cm9sbGVyOgorCSAqLworCisJLyogTWFwIGJhbmtzIDAgYW5kIDEgdG8gdGhlIEZMQVNIIGJhbmtzIDAgYW5kIDEgYXQgcHJlbGltaW5hcnkKKwkgKiBhZGRyZXNzZXMgLSB0aGVzZSBoYXZlIHRvIGJlIG1vZGlmaWVkIGxhdGVyIHdoZW4gRkxBU0ggc2l6ZQorCSAqIGhhcyBiZWVuIGRldGVybWluZWQKKwkgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX1NZU19PUjBfUkVNQVApCisJbWVtY3RsLT5tZW1jX29yMCA9IENPTkZJR19TWVNfT1IwX1JFTUFQOworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfU1lTX09SMV9SRU1BUCkKKwltZW1jdGwtPm1lbWNfb3IxID0gQ09ORklHX1NZU19PUjFfUkVNQVA7CisjZW5kaWYKKworCS8qIG5vdyByZXN0cmljdCB0byBwcmVsaW1pbmFyeSByYW5nZSAqLworCS8qIHRoZSBQUyBjYW1lIGZyb20gdGhlIEhSQ1csIGRvbrR0IGNoYW5nZSBpdCAqLworCW1lbWN0bC0+bWVtY19icjAgPSBTRVRfVkFMX01BU0sobWVtY3RsLT5tZW1jX2JyMCAsIENPTkZJR19TWVNfQlIwX1BSRUxJTSwgQlJ4X1BTX01TSyk7CisJbWVtY3RsLT5tZW1jX29yMCA9IENPTkZJR19TWVNfT1IwX1BSRUxJTTsKKworI2lmIGRlZmluZWQoQ09ORklHX1NZU19CUjFfUFJFTElNKSAmJiBkZWZpbmVkKENPTkZJR19TWVNfT1IxX1BSRUxJTSkKKwltZW1jdGwtPm1lbWNfb3IxID0gQ09ORklHX1NZU19PUjFfUFJFTElNOworCW1lbWN0bC0+bWVtY19icjEgPSBDT05GSUdfU1lTX0JSMV9QUkVMSU07CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NZU19CUjJfUFJFTElNKSAmJiBkZWZpbmVkKENPTkZJR19TWVNfT1IyX1BSRUxJTSkKKwltZW1jdGwtPm1lbWNfb3IyID0gQ09ORklHX1NZU19PUjJfUFJFTElNOworCW1lbWN0bC0+bWVtY19icjIgPSBDT05GSUdfU1lTX0JSMl9QUkVMSU07CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NZU19CUjNfUFJFTElNKSAmJiBkZWZpbmVkKENPTkZJR19TWVNfT1IzX1BSRUxJTSkKKwltZW1jdGwtPm1lbWNfb3IzID0gQ09ORklHX1NZU19PUjNfUFJFTElNOworCW1lbWN0bC0+bWVtY19icjMgPSBDT05GSUdfU1lTX0JSM19QUkVMSU07CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NZU19CUjRfUFJFTElNKSAmJiBkZWZpbmVkKENPTkZJR19TWVNfT1I0X1BSRUxJTSkKKwltZW1jdGwtPm1lbWNfb3I0ID0gQ09ORklHX1NZU19PUjRfUFJFTElNOworCW1lbWN0bC0+bWVtY19icjQgPSBDT05GSUdfU1lTX0JSNF9QUkVMSU07CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NZU19CUjVfUFJFTElNKSAmJiBkZWZpbmVkKENPTkZJR19TWVNfT1I1X1BSRUxJTSkKKwltZW1jdGwtPm1lbWNfb3I1ID0gQ09ORklHX1NZU19PUjVfUFJFTElNOworCW1lbWN0bC0+bWVtY19icjUgPSBDT05GSUdfU1lTX0JSNV9QUkVMSU07CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NZU19CUjZfUFJFTElNKSAmJiBkZWZpbmVkKENPTkZJR19TWVNfT1I2X1BSRUxJTSkKKwltZW1jdGwtPm1lbWNfb3I2ID0gQ09ORklHX1NZU19PUjZfUFJFTElNOworCW1lbWN0bC0+bWVtY19icjYgPSBDT05GSUdfU1lTX0JSNl9QUkVMSU07CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NZU19CUjdfUFJFTElNKSAmJiBkZWZpbmVkKENPTkZJR19TWVNfT1I3X1BSRUxJTSkKKwltZW1jdGwtPm1lbWNfb3I3ID0gQ09ORklHX1NZU19PUjdfUFJFTElNOworCW1lbWN0bC0+bWVtY19icjcgPSBDT05GSUdfU1lTX0JSN19QUkVMSU07CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NZU19CUjhfUFJFTElNKSAmJiBkZWZpbmVkKENPTkZJR19TWVNfT1I4X1BSRUxJTSkKKwltZW1jdGwtPm1lbWNfb3I4ID0gQ09ORklHX1NZU19PUjhfUFJFTElNOworCW1lbWN0bC0+bWVtY19icjggPSBDT05GSUdfU1lTX0JSOF9QUkVMSU07CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NZU19CUjlfUFJFTElNKSAmJiBkZWZpbmVkKENPTkZJR19TWVNfT1I5X1BSRUxJTSkKKwltZW1jdGwtPm1lbWNfb3I5ID0gQ09ORklHX1NZU19PUjlfUFJFTElNOworCW1lbWN0bC0+bWVtY19icjkgPSBDT05GSUdfU1lTX0JSOV9QUkVMSU07CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NZU19CUjEwX1BSRUxJTSkgJiYgZGVmaW5lZChDT05GSUdfU1lTX09SMTBfUFJFTElNKQorCW1lbWN0bC0+bWVtY19vcjEwID0gQ09ORklHX1NZU19PUjEwX1BSRUxJTTsKKwltZW1jdGwtPm1lbWNfYnIxMCA9IENPTkZJR19TWVNfQlIxMF9QUkVMSU07CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NZU19CUjExX1BSRUxJTSkgJiYgZGVmaW5lZChDT05GSUdfU1lTX09SMTFfUFJFTElNKQorCW1lbWN0bC0+bWVtY19vcjExID0gQ09ORklHX1NZU19PUjExX1BSRUxJTTsKKwltZW1jdGwtPm1lbWNfYnIxMSA9IENPTkZJR19TWVNfQlIxMV9QUkVMSU07CisjZW5kaWYKKworCW04MjYwX2NwbV9yZXNldCAoKTsKK30KKworLyoKKyAqIGluaXRpYWxpemUgaGlnaGVyIGxldmVsIHBhcnRzIG9mIENQVSBsaWtlIHRpbWUgYmFzZSBhbmQgdGltZXJzCisgKi8KK2ludCBjcHVfaW5pdF9yICh2b2lkKQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltbXIgPSAoaW1tYXBfdCAqKSBnZC0+YmQtPmJpX2ltbXJfYmFzZTsKKworCWltbXItPmltX2NwbS5jcF9yY2NyID0gQ09ORklHX1NZU19SQ0NSOworCisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqIHByaW50IG91dCB0aGUgcmVhc29uIGZvciB0aGUgcmVzZXQKKyAqLworaW50IHBydF84MjYwX3JzciAodm9pZCkKK3sKKwlzdGF0aWMgc3RydWN0IHsKKwkJdWxvbmcgbWFzazsKKwkJY2hhciAqZGVzYzsKKwl9IGJpdHNbXSA9IHsKKwkJeworCQlSU1JfSlRSUywgIkpUQUcifSwgeworCQlSU1JfQ1NSUywgIkNoZWNrIFN0b3AifSwgeworCQlSU1JfU1dSUywgIlNvZnR3YXJlIFdhdGNoZG9nIn0sIHsKKwkJUlNSX0JNUlMsICJCdXMgTW9uaXRvciJ9LCB7CisJCVJTUl9FU1JTLCAiRXh0ZXJuYWwgU29mdCJ9LCB7CisJCVJTUl9FSFJTLCAiRXh0ZXJuYWwgSGFyZCJ9CisJfTsKKwlzdGF0aWMgaW50IG4gPSBzaXplb2YgYml0cyAvIHNpemVvZiBiaXRzWzBdOworCXVsb25nIHJzciA9IGdkLT5yZXNldF9zdGF0dXM7CisJaW50IGk7CisJY2hhciAqc2VwOworCisJcHV0cyAoQ1BVX0lEX1NUUiAiIFJlc2V0IFN0YXR1czoiKTsKKworCXNlcCA9ICIgIjsKKwlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorCQlpZiAocnNyICYgYml0c1tpXS5tYXNrKSB7CisJCQlwcmludGYgKCIlcyVzIiwgc2VwLCBiaXRzW2ldLmRlc2MpOworCQkJc2VwID0gIiwgIjsKKwkJfQorCisJcHV0cyAoIlxuXG4iKTsKKwlyZXR1cm4gKDApOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjYwL2V0aGVyX2ZjYy5jIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjYwL2V0aGVyX2ZjYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhYzAyYTAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgyNjAvZXRoZXJfZmNjLmMKQEAgLTAsMCArMSwxMTkwIEBACisvKgorICogTVBDODI2MCBGQ0MgRmFzdCBFdGhlcm5ldAorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMCBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuICAgRGFuIE1hbGVrIChkbWFsZWtAamxjLm5ldCkKKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDAgU3lzZ28gUmVhbC1UaW1lIFNvbHV0aW9ucywgR21iSCA8d3d3LmVsaW5vcy5jb20+CisgKiBNYXJpdXMgR3JvZWdlciA8bWdyb2VnZXJAc3lzZ28uZGU+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyoKKyAqIE1QQzgyNjAgRkNDIEZhc3QgRXRoZXJuZXQKKyAqIEJhc2ljIEVUIEhXIGluaXRpYWxpemF0aW9uIGFuZCBwYWNrZXQgUlgvVFggcm91dGluZXMKKyAqCisgKiBUaGlzIGNvZGUgd2lsbCBub3QgcGVyZm9ybSB0aGUgSU8gcG9ydCBjb25maWd1cmF0aW9uLiBUaGlzIHNob3VsZCBiZQorICogZG9uZSBpbiB0aGUgaW9wX2NvbmZfdCBzdHJ1Y3R1cmUgc3BlY2lmaWMgZm9yIHRoZSBib2FyZC4KKyAqCisgKiBUT0RPOgorICogYWRkIGEgUEhZIGRyaXZlciB0byBkbyB0aGUgbmVnb3RpYXRpb24KKyAqIHJlZmxlY3QgbmVnb3RpYXRpb24gcmVzdWx0cyBpbiBGUFNNUgorICogbG9vayBmb3Igd2F5cyB0byBjb25maWd1cmUgdGhlIGJvYXJkIHNwZWNpZmljIHN0dWZmIGVsc2V3aGVyZSwgZWcuCisgKiAgICBjb25maWdfeHh4Lmggb3IgdGhlIGJvYXJkIGRpcmVjdG9yeQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpbmNsdWRlIDxhc20vY3BtXzgyNjAuaD4KKyNpbmNsdWRlIDxtcGM4MjYwLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPG5ldC5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfTUlJKSB8fCBkZWZpbmVkKENPTkZJR19DTURfTUlJKQorI2luY2x1ZGUgPG1paXBoeS5oPgorI2VuZGlmCisKK0RFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCisjaWYgZGVmaW5lZChDT05GSUdfRVRIRVJfT05fRkNDKSAmJiBkZWZpbmVkKENPTkZJR19DTURfTkVUKSAmJiBcCisJZGVmaW5lZChDT05GSUdfTkVUX01VTFRJKQorCitzdGF0aWMgc3RydWN0IGV0aGVyX2ZjY19pbmZvX3MKK3sKKwlpbnQgZXRoZXJfaW5kZXg7CisJaW50IHByb2ZmX2VuZXQ7CisJdWxvbmcgY3BtX2NyX2VuZXRfc2Jsb2NrOworCXVsb25nIGNwbV9jcl9lbmV0X3BhZ2U7CisJdWxvbmcgY214ZmNyX21hc2s7CisJdWxvbmcgY214ZmNyX3ZhbHVlOworfQorCWV0aGVyX2ZjY19pbmZvW10gPQoreworI2lmZGVmIENPTkZJR19FVEhFUl9PTl9GQ0MxCit7CisJMCwKKwlQUk9GRl9GQ0MxLAorCUNQTV9DUl9GQ0MxX1NCTE9DSywKKwlDUE1fQ1JfRkNDMV9QQUdFLAorCUNPTkZJR19TWVNfQ01YRkNSX01BU0sxLAorCUNPTkZJR19TWVNfQ01YRkNSX1ZBTFVFMQorfSwKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0VUSEVSX09OX0ZDQzIKK3sKKwkxLAorCVBST0ZGX0ZDQzIsCisJQ1BNX0NSX0ZDQzJfU0JMT0NLLAorCUNQTV9DUl9GQ0MyX1BBR0UsCisJQ09ORklHX1NZU19DTVhGQ1JfTUFTSzIsCisJQ09ORklHX1NZU19DTVhGQ1JfVkFMVUUyCit9LAorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfRVRIRVJfT05fRkNDMworeworCTIsCisJUFJPRkZfRkNDMywKKwlDUE1fQ1JfRkNDM19TQkxPQ0ssCisJQ1BNX0NSX0ZDQzNfUEFHRSwKKwlDT05GSUdfU1lTX0NNWEZDUl9NQVNLMywKKwlDT05GSUdfU1lTX0NNWEZDUl9WQUxVRTMKK30sCisjZW5kaWYKK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogTWF4aW11bSBpbnB1dCBETUEgc2l6ZS4gIE11c3QgYmUgYSBzaG91bGQoPykgYmUgYSBtdWx0aXBsZSBvZiA0LiAqLworI2RlZmluZSBQS1RfTUFYRE1BX1NJWkUgICAgICAgICAxNTIwCisKKy8qIFRoZSBGQ0Mgc3RvcmVzIGRlc3Qvc3JjL3R5cGUsIGRhdGEsIGFuZCBjaGVja3N1bSBmb3IgcmVjZWl2ZSBwYWNrZXRzLiAqLworI2RlZmluZSBQS1RfTUFYQlVGX1NJWkUgICAgICAgICAxNTE4CisjZGVmaW5lIFBLVF9NSU5CVUZfU0laRSAgICAgICAgIDY0CisKKy8qIE1heGltdW0gaW5wdXQgYnVmZmVyIHNpemUuICBNdXN0IGJlIGEgbXVsdGlwbGUgb2YgMzIuICovCisjZGVmaW5lIFBLVF9NQVhCTFJfU0laRSAgICAgICAgIDE1MzYKKworI2RlZmluZSBUT1VUX0xPT1AgMTAwMDAwMAorCisjZGVmaW5lIFRYX0JVRl9DTlQgMgorI2lmZGVmIF9fR05VQ19fCitzdGF0aWMgY2hhciB0eGJ1ZltUWF9CVUZfQ05UXVtQS1RfTUFYQkxSX1NJWkVdIF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDgpKSk7CisjZWxzZQorI2Vycm9yICJ0eGJ1ZiBtdXN0IGJlIDY0LWJpdCBhbGlnbmVkIgorI2VuZGlmCisKK3N0YXRpYyB1aW50IHJ4SWR4OwkvKiBpbmRleCBvZiB0aGUgY3VycmVudCBSWCBidWZmZXIgKi8KK3N0YXRpYyB1aW50IHR4SWR4OwkvKiBpbmRleCBvZiB0aGUgY3VycmVudCBUWCBidWZmZXIgKi8KKworLyoKKyAqIEZDQyBFdGhlcm5ldCBUeCBhbmQgUnggYnVmZmVyIGRlc2NyaXB0b3JzLgorICogUHJvdmlkZSBmb3IgRG91YmxlIEJ1ZmZlcmluZworICogTm90ZTogUEtUQlVGU1JYIGlzIGRlZmluZWQgaW4gbmV0LmgKKyAqLworCit0eXBlZGVmIHZvbGF0aWxlIHN0cnVjdCBydHhiZCB7CisgICAgY2JkX3QgcnhiZFtQS1RCVUZTUlhdOworICAgIGNiZF90IHR4YmRbVFhfQlVGX0NOVF07Cit9IFJUWEJEOworCisvKiAgR29vZCBuZXdzOiB0aGUgRkNDIHN1cHBvcnRzIGV4dGVybmFsIEJEcyEgKi8KKyNpZmRlZiBfX0dOVUNfXworc3RhdGljIFJUWEJEIHJ0eCBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCg4KSkpOworI2Vsc2UKKyNlcnJvciAicnR4IG11c3QgYmUgNjQtYml0IGFsaWduZWQiCisjZW5kaWYKKworc3RhdGljIGludCBmZWNfc2VuZChzdHJ1Y3QgZXRoX2RldmljZSogZGV2LCB2b2xhdGlsZSB2b2lkICpwYWNrZXQsIGludCBsZW5ndGgpCit7CisgICAgaW50IGk7CisgICAgaW50IHJlc3VsdCA9IDA7CisKKyAgICBpZiAobGVuZ3RoIDw9IDApIHsKKwlwcmludGYoImZlYzogYmFkIHBhY2tldCBzaXplOiAlZFxuIiwgbGVuZ3RoKTsKKwlnb3RvIG91dDsKKyAgICB9CisKKyAgICBmb3IoaT0wOyBydHgudHhiZFt0eElkeF0uY2JkX3NjICYgQkRfRU5FVF9UWF9SRUFEWTsgaSsrKSB7CisJaWYgKGkgPj0gVE9VVF9MT09QKSB7CisJICAgIHB1dHMgKCJmZWM6IHR4IGJ1ZmZlciBub3QgcmVhZHlcbiIpOworCSAgICBnb3RvIG91dDsKKwl9CisgICAgfQorCisgICAgcnR4LnR4YmRbdHhJZHhdLmNiZF9idWZhZGRyID0gKHVpbnQpcGFja2V0OworICAgIHJ0eC50eGJkW3R4SWR4XS5jYmRfZGF0bGVuID0gbGVuZ3RoOworICAgIHJ0eC50eGJkW3R4SWR4XS5jYmRfc2MgfD0gKEJEX0VORVRfVFhfUkVBRFkgfCBCRF9FTkVUX1RYX0xBU1QgfAorCQkJICAgICAgIEJEX0VORVRfVFhfV1JBUCk7CisKKyAgICBmb3IoaT0wOyBydHgudHhiZFt0eElkeF0uY2JkX3NjICYgQkRfRU5FVF9UWF9SRUFEWTsgaSsrKSB7CisJaWYgKGkgPj0gVE9VVF9MT09QKSB7CisJICAgIHB1dHMgKCJmZWM6IHR4IGVycm9yXG4iKTsKKwkgICAgZ290byBvdXQ7CisJfQorICAgIH0KKworI2lmZGVmIEVUX0RFQlVHCisgICAgcHJpbnRmKCJjeWNsZXM6ICVkIHN0YXR1czogJTA0eFxuIiwgaSwgcnR4LnR4YmRbdHhJZHhdLmNiZF9zYyk7CisjZW5kaWYKKworICAgIC8qIHJldHVybiBvbmx5IHN0YXR1cyBiaXRzICovCisgICAgcmVzdWx0ID0gcnR4LnR4YmRbdHhJZHhdLmNiZF9zYyAmIEJEX0VORVRfVFhfU1RBVFM7CisKK291dDoKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IGZlY19yZWN2KHN0cnVjdCBldGhfZGV2aWNlKiBkZXYpCit7CisgICAgaW50IGxlbmd0aDsKKworICAgIGZvciAoOzspCisgICAgeworCWlmIChydHgucnhiZFtyeElkeF0uY2JkX3NjICYgQkRfRU5FVF9SWF9FTVBUWSkgeworCSAgICBsZW5ndGggPSAtMTsKKwkgICAgYnJlYWs7ICAgICAvKiBub3RoaW5nIHJlY2VpdmVkIC0gbGVhdmUgZm9yKCkgbG9vcCAqLworCX0KKwlsZW5ndGggPSBydHgucnhiZFtyeElkeF0uY2JkX2RhdGxlbjsKKworCWlmIChydHgucnhiZFtyeElkeF0uY2JkX3NjICYgMHgwMDNmKSB7CisJICAgIHByaW50ZigiZmVjOiByeCBlcnJvciAlMDR4XG4iLCBydHgucnhiZFtyeElkeF0uY2JkX3NjKTsKKwl9CisJZWxzZSB7CisJICAgIC8qIFBhc3MgdGhlIHBhY2tldCB1cCB0byB0aGUgcHJvdG9jb2wgbGF5ZXJzLiAqLworCSAgICBOZXRSZWNlaXZlKE5ldFJ4UGFja2V0c1tyeElkeF0sIGxlbmd0aCAtIDQpOworCX0KKworCisJLyogR2l2ZSB0aGUgYnVmZmVyIGJhY2sgdG8gdGhlIEZDQy4gKi8KKwlydHgucnhiZFtyeElkeF0uY2JkX2RhdGxlbiA9IDA7CisKKwkvKiB3cmFwIGFyb3VuZCBidWZmZXIgaW5kZXggd2hlbiBuZWNlc3NhcnkgKi8KKwlpZiAoKHJ4SWR4ICsgMSkgPj0gUEtUQlVGU1JYKSB7CisJICAgIHJ0eC5yeGJkW1BLVEJVRlNSWCAtIDFdLmNiZF9zYyA9IChCRF9FTkVUX1JYX1dSQVAgfCBCRF9FTkVUX1JYX0VNUFRZKTsKKwkgICAgcnhJZHggPSAwOworCX0KKwllbHNlIHsKKwkgICAgcnR4LnJ4YmRbcnhJZHhdLmNiZF9zYyA9IEJEX0VORVRfUlhfRU1QVFk7CisJICAgIHJ4SWR4Kys7CisJfQorICAgIH0KKyAgICByZXR1cm4gbGVuZ3RoOworfQorCisKK3N0YXRpYyBpbnQgZmVjX2luaXQoc3RydWN0IGV0aF9kZXZpY2UqIGRldiwgYmRfdCAqYmlzKQoreworICAgIHN0cnVjdCBldGhlcl9mY2NfaW5mb19zICogaW5mbyA9IGRldi0+cHJpdjsKKyAgICBpbnQgaTsKKyAgICB2b2xhdGlsZSBpbW1hcF90ICppbW1yID0gKGltbWFwX3QgKilDT05GSUdfU1lTX0lNTVI7CisgICAgdm9sYXRpbGUgY3BtODI2MF90ICpjcCA9ICYoaW1tci0+aW1fY3BtKTsKKyAgICBmY2NfZW5ldF90ICpwcmFtX3B0cjsKKyAgICB1bnNpZ25lZCBsb25nIG1lbV9hZGRyOworCisjaWYgMAorICAgIG1paV9kaXNjb3Zlcl9waHkoKTsKKyNlbmRpZgorCisgICAgLyogMjguOSAtICgxLTIpOiBpb3BvcnRzIGhhdmUgYmVlbiBzZXQgdXAgYWxyZWFkeSAqLworCisgICAgLyogMjguOSAtICgzKTogY29ubmVjdCBGQ0MncyB0eCBhbmQgcnggY2xvY2tzICovCisgICAgaW1tci0+aW1fY3BtdXguY214X3VhciA9IDA7CisgICAgaW1tci0+aW1fY3BtdXguY214X2ZjciA9IChpbW1yLT5pbV9jcG11eC5jbXhfZmNyICYgfmluZm8tPmNteGZjcl9tYXNrKSB8CisJCQkJCQkJaW5mby0+Y214ZmNyX3ZhbHVlOworCisgICAgLyogMjguOSAtICg0KTogR0ZNUjogZGlzYWJsZSB0eC9yeCwgQ0NJVFQgQ1JDLCBNb2RlIEV0aGVybmV0ICovCisgICAgaW1tci0+aW1fZmNjW2luZm8tPmV0aGVyX2luZGV4XS5mY2NfZ2ZtciA9CisgICAgICBGQ0NfR0ZNUl9NT0RFX0VORVQgfCBGQ0NfR0ZNUl9UQ1JDXzMyOworCisgICAgLyogMjguOSAtICg1KTogRlBTTVI6IGVuYWJsZSBmdWxsIGR1cGxleCwgc2VsZWN0IENDSVRUIENSQyBmb3IgRXRoZXJuZXQgKi8KKyAgICBpbW1yLT5pbV9mY2NbaW5mby0+ZXRoZXJfaW5kZXhdLmZjY19mcHNtciA9IENPTkZJR19TWVNfRkNDX1BTTVIgfCBGQ0NfUFNNUl9FTkNSQzsKKworICAgIC8qIDI4LjkgLSAoNik6IEZEU1I6IEV0aGVybmV0IFN5biAqLworICAgIGltbXItPmltX2ZjY1tpbmZvLT5ldGhlcl9pbmRleF0uZmNjX2Zkc3IgPSAweEQ1NTU7CisKKyAgICAvKiByZXNldCBpbmRlY2VzIHRvIGN1cnJlbnQgcngvdHggYmQgKHNlZSBldGhfc2VuZCgpL2V0aF9yeCgpKSAqLworICAgIHJ4SWR4ID0gMDsKKyAgICB0eElkeCA9IDA7CisKKyAgICAvKiBTZXR1cCBSZWNlaXZlciBCdWZmZXIgRGVzY3JpcHRvcnMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgUEtUQlVGU1JYOyBpKyspCisgICAgeworICAgICAgcnR4LnJ4YmRbaV0uY2JkX3NjID0gQkRfRU5FVF9SWF9FTVBUWTsKKyAgICAgIHJ0eC5yeGJkW2ldLmNiZF9kYXRsZW4gPSAwOworICAgICAgcnR4LnJ4YmRbaV0uY2JkX2J1ZmFkZHIgPSAodWludClOZXRSeFBhY2tldHNbaV07CisgICAgfQorICAgIHJ0eC5yeGJkW1BLVEJVRlNSWCAtIDFdLmNiZF9zYyB8PSBCRF9FTkVUX1JYX1dSQVA7CisKKyAgICAvKiBTZXR1cCBFdGhlcm5ldCBUcmFuc21pdHRlciBCdWZmZXIgRGVzY3JpcHRvcnMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgVFhfQlVGX0NOVDsgaSsrKQorICAgIHsKKyAgICAgIHJ0eC50eGJkW2ldLmNiZF9zYyA9IChCRF9FTkVUX1RYX1BBRCB8IEJEX0VORVRfVFhfTEFTVCB8IEJEX0VORVRfVFhfVEMpOworICAgICAgcnR4LnR4YmRbaV0uY2JkX2RhdGxlbiA9IDA7CisgICAgICBydHgudHhiZFtpXS5jYmRfYnVmYWRkciA9ICh1aW50KSZ0eGJ1ZltpXVswXTsKKyAgICB9CisgICAgcnR4LnR4YmRbVFhfQlVGX0NOVCAtIDFdLmNiZF9zYyB8PSBCRF9FTkVUX1RYX1dSQVA7CisKKyAgICAvKiAyOC45IC0gKDcpOiBpbml0aWFsaXNlIHBhcmFtZXRlciByYW0gKi8KKyAgICBwcmFtX3B0ciA9IChmY2NfZW5ldF90ICopJihpbW1yLT5pbV9kcHJhbWJhc2VbaW5mby0+cHJvZmZfZW5ldF0pOworCisgICAgLyogY2xlYXIgd2hvbGUgc3RydWN0dXJlIHRvIG1ha2Ugc3VyZSBhbGwgcmVzZXJ2ZWQgZmllbGRzIGFyZSB6ZXJvICovCisgICAgbWVtc2V0KCh2b2lkKilwcmFtX3B0ciwgMCwgc2l6ZW9mKGZjY19lbmV0X3QpKTsKKworICAgIC8qCisgICAgICogY29tbW9uIFBhcmFtZXRlciBSQU0gYXJlYQorICAgICAqCisgICAgICogQWxsb2NhdGUgc3BhY2UgaW4gdGhlIHJlc2VydmVkIEZDQyBhcmVhIG9mIERQUkFNIGZvciB0aGUKKyAgICAgKiBpbnRlcm5hbCBidWZmZXJzLiAgTm8gb25lIHVzZXMgdGhpcyBzcGFjZSAoeWV0KSwgc28gd2UKKyAgICAgKiBjYW4gZG8gdGhpcy4gIExhdGVyLCB3ZSB3aWxsIGFkZCByZXNvdXJjZSBtYW5hZ2VtZW50IGZvcgorICAgICAqIHRoaXMgYXJlYS4KKyAgICAgKi8KKyAgICBtZW1fYWRkciA9IENQTV9GQ0NfU1BFQ0lBTF9CQVNFICsgKChpbmZvLT5ldGhlcl9pbmRleCkgKiA2NCk7CisgICAgcHJhbV9wdHItPmZlbl9nZW5mY2MuZmNjX3JpcHRyID0gbWVtX2FkZHI7CisgICAgcHJhbV9wdHItPmZlbl9nZW5mY2MuZmNjX3RpcHRyID0gbWVtX2FkZHIrMzI7CisgICAgLyoKKyAgICAgKiBTZXQgbWF4aW11bSBieXRlcyBwZXIgcmVjZWl2ZSBidWZmZXIuCisgICAgICogSXQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLgorICAgICAqLworICAgIHByYW1fcHRyLT5mZW5fZ2VuZmNjLmZjY19tcmJsciA9IFBLVF9NQVhCTFJfU0laRTsKKyAgICBwcmFtX3B0ci0+ZmVuX2dlbmZjYy5mY2NfcnN0YXRlID0gKENQTUZDUl9HQkwgfCBDUE1GQ1JfRUIgfAorCQkJCSAgICAgICBDT05GSUdfU1lTX0NQTUZDUl9SQU1UWVBFKSA8PCAyNDsKKyAgICBwcmFtX3B0ci0+ZmVuX2dlbmZjYy5mY2NfcmJhc2UgPSAodW5zaWduZWQgaW50KSgmcnR4LnJ4YmRbcnhJZHhdKTsKKyAgICBwcmFtX3B0ci0+ZmVuX2dlbmZjYy5mY2NfdHN0YXRlID0gKENQTUZDUl9HQkwgfCBDUE1GQ1JfRUIgfAorCQkJCSAgICAgICBDT05GSUdfU1lTX0NQTUZDUl9SQU1UWVBFKSA8PCAyNDsKKyAgICBwcmFtX3B0ci0+ZmVuX2dlbmZjYy5mY2NfdGJhc2UgPSAodW5zaWduZWQgaW50KSgmcnR4LnR4YmRbdHhJZHhdKTsKKworICAgIC8qIHByb3RvY29sLXNwZWNpZmljIGFyZWEgKi8KKyAgICBwcmFtX3B0ci0+ZmVuX2NtYXNrID0gMHhkZWJiMjBlMzsJLyogQ1JDIG1hc2sgKi8KKyAgICBwcmFtX3B0ci0+ZmVuX2NwcmVzID0gMHhmZmZmZmZmZjsJLyogQ1JDIHByZXNldCAqLworICAgIHByYW1fcHRyLT5mZW5fcmV0bGltID0gMTU7CQkvKiBSZXRyeSBsaW1pdCB0aHJlc2hvbGQgKi8KKyAgICBwcmFtX3B0ci0+ZmVuX21mbHIgPSBQS1RfTUFYQlVGX1NJWkU7ICAgLyogbWF4aW11bSBmcmFtZSBsZW5ndGggcmVnaXN0ZXIgKi8KKyAgICAvKgorICAgICAqIFNldCBFdGhlcm5ldCBzdGF0aW9uIGFkZHJlc3MuCisgICAgICoKKyAgICAgKiBUaGlzIGlzIHN1cHBsaWVkIGluIHRoZSBib2FyZCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUsIHNvIHdlCisgICAgICogY29weSB0aGF0IGludG8gdGhlIGNvbnRyb2xsZXIuCisgICAgICogU28sIGZhciB3ZSBoYXZlIG9ubHkgYmVlbiBnaXZlbiBvbmUgRXRoZXJuZXQgYWRkcmVzcy4gV2UgbWFrZQorICAgICAqIGl0IHVuaXF1ZSBieSBzZXR0aW5nIGEgZmV3IGJpdHMgaW4gdGhlIHVwcGVyIGJ5dGUgb2YgdGhlCisgICAgICogbm9uLXN0YXRpYyBwYXJ0IG9mIHRoZSBhZGRyZXNzLgorICAgICAqLworI2RlZmluZSBlYSBldGhfZ2V0X2RldigpLT5lbmV0YWRkcgorICAgIHByYW1fcHRyLT5mZW5fcGFkZHJoID0gKGVhWzVdIDw8IDgpICsgZWFbNF07CisgICAgcHJhbV9wdHItPmZlbl9wYWRkcm0gPSAoZWFbM10gPDwgOCkgKyBlYVsyXTsKKyAgICBwcmFtX3B0ci0+ZmVuX3BhZGRybCA9IChlYVsxXSA8PCA4KSArIGVhWzBdOworI3VuZGVmIGVhCisgICAgcHJhbV9wdHItPmZlbl9taW5mbHIgPSBQS1RfTUlOQlVGX1NJWkU7IC8qIG1pbmltdW0gZnJhbWUgbGVuZ3RoIHJlZ2lzdGVyICovCisgICAgLyogcGFkIHBvaW50ZXIuIHVzZSB0aXB0ciBzaW5jZSB3ZSBkb24ndCBuZWVkIGEgc3BlY2lmaWMgcGFkZGluZyBjaGFyICovCisgICAgcHJhbV9wdHItPmZlbl9wYWRwdHIgPSBwcmFtX3B0ci0+ZmVuX2dlbmZjYy5mY2NfdGlwdHI7CisgICAgcHJhbV9wdHItPmZlbl9tYXhkMSA9IFBLVF9NQVhETUFfU0laRTsJLyogbWF4aW11bSBETUExIGxlbmd0aCAqLworICAgIHByYW1fcHRyLT5mZW5fbWF4ZDIgPSBQS1RfTUFYRE1BX1NJWkU7CS8qIG1heGltdW0gRE1BMiBsZW5ndGggKi8KKyAgICBwcmFtX3B0ci0+ZmVuX3JmdGhyID0gMTsKKyAgICBwcmFtX3B0ci0+ZmVuX3JmY250ID0gMTsKKyNpZiAwCisgICAgcHJpbnRmKCJwcmFtX3B0ci0+ZmVuX2dlbmZjYy5mY2NfcmJhc2UgJTA4bHhcbiIsCisJcHJhbV9wdHItPmZlbl9nZW5mY2MuZmNjX3JiYXNlKTsKKyAgICBwcmludGYoInByYW1fcHRyLT5mZW5fZ2VuZmNjLmZjY190YmFzZSAlMDhseFxuIiwKKwlwcmFtX3B0ci0+ZmVuX2dlbmZjYy5mY2NfdGJhc2UpOworI2VuZGlmCisKKyAgICAvKiAyOC45IC0gKDgpOiBjbGVhciBvdXQgZXZlbnRzIGluIEZDQ0UgKi8KKyAgICBpbW1yLT5pbV9mY2NbaW5mby0+ZXRoZXJfaW5kZXhdLmZjY19mY2NlID0gfjB4MDsKKworICAgIC8qIDI4LjkgLSAoOSk6IEZDQ006IG1hc2sgYWxsIGV2ZW50cyAqLworICAgIGltbXItPmltX2ZjY1tpbmZvLT5ldGhlcl9pbmRleF0uZmNjX2ZjY20gPSAwOworCisgICAgLyogMjguOSAtICgxMC0xMik6IHdlIGRvbid0IHVzZSBldGhlcm5ldCBpbnRlcnJ1cHRzICovCisKKyAgICAvKiAyOC45IC0gKDEzKQorICAgICAqCisgICAgICogTGV0J3MgcmUtaW5pdGlhbGl6ZSB0aGUgY2hhbm5lbCBub3cuICBXZSBoYXZlIHRvIGRvIGl0IGxhdGVyCisgICAgICogdGhhbiB0aGUgbWFudWFsIGRlc2NyaWJlcyBiZWNhdXNlIHdlIGhhdmUganVzdCBub3cgZmluaXNoZWQKKyAgICAgKiB0aGUgQkQgaW5pdGlhbGl6YXRpb24uCisgICAgICovCisgICAgY3AtPmNwX2NwY3IgPSBta19jcl9jbWQoaW5mby0+Y3BtX2NyX2VuZXRfcGFnZSwKKwkJCSAgICBpbmZvLT5jcG1fY3JfZW5ldF9zYmxvY2ssCisJCQkgICAgMHgwYywKKwkJCSAgICBDUE1fQ1JfSU5JVF9UUlgpIHwgQ1BNX0NSX0ZMRzsKKyAgICBkbyB7CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJlaWVpbyIpOworICAgIH0gd2hpbGUgKGNwLT5jcF9jcGNyICYgQ1BNX0NSX0ZMRyk7CisKKyAgICAvKiAyOC45IC0gKDE0KTogZW5hYmxlIHR4L3J4IGluIGdmbXIgKi8KKyAgICBpbW1yLT5pbV9mY2NbaW5mby0+ZXRoZXJfaW5kZXhdLmZjY19nZm1yIHw9IEZDQ19HRk1SX0VOVCB8IEZDQ19HRk1SX0VOUjsKKworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBmZWNfaGFsdChzdHJ1Y3QgZXRoX2RldmljZSogZGV2KQoreworICAgIHN0cnVjdCBldGhlcl9mY2NfaW5mb19zICogaW5mbyA9IGRldi0+cHJpdjsKKyAgICB2b2xhdGlsZSBpbW1hcF90ICppbW1yID0gKGltbWFwX3QgKilDT05GSUdfU1lTX0lNTVI7CisKKyAgICAvKiB3cml0ZSBHRk1SOiBkaXNhYmxlIHR4L3J4ICovCisgICAgaW1tci0+aW1fZmNjW2luZm8tPmV0aGVyX2luZGV4XS5mY2NfZ2ZtciAmPQorCQkJCQkJfihGQ0NfR0ZNUl9FTlQgfCBGQ0NfR0ZNUl9FTlIpOworfQorCitpbnQgZmVjX2luaXRpYWxpemUoYmRfdCAqYmlzKQoreworCXN0cnVjdCBldGhfZGV2aWNlKiBkZXY7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGV0aGVyX2ZjY19pbmZvKSAvIHNpemVvZihldGhlcl9mY2NfaW5mb1swXSk7IGkrKykKKwl7CisJCWRldiA9IChzdHJ1Y3QgZXRoX2RldmljZSopIG1hbGxvYyhzaXplb2YgKmRldik7CisJCW1lbXNldChkZXYsIDAsIHNpemVvZiAqZGV2KTsKKworCQlzcHJpbnRmKGRldi0+bmFtZSwgIkZDQyVkIEVUSEVSTkVUIiwKKwkJCWV0aGVyX2ZjY19pbmZvW2ldLmV0aGVyX2luZGV4ICsgMSk7CisJCWRldi0+cHJpdiAgID0gJmV0aGVyX2ZjY19pbmZvW2ldOworCQlkZXYtPmluaXQgICA9IGZlY19pbml0OworCQlkZXYtPmhhbHQgICA9IGZlY19oYWx0OworCQlkZXYtPnNlbmQgICA9IGZlY19zZW5kOworCQlkZXYtPnJlY3YgICA9IGZlY19yZWN2OworCisJCWV0aF9yZWdpc3RlcihkZXYpOworCisjaWYgKGRlZmluZWQoQ09ORklHX01JSSkgfHwgZGVmaW5lZChDT05GSUdfQ01EX01JSSkpIFwKKwkJJiYgZGVmaW5lZChDT05GSUdfQklUQkFOR01JSSkKKwkJbWlpcGh5X3JlZ2lzdGVyKGRldi0+bmFtZSwKKwkJCQliYl9taWlwaHlfcmVhZCwJYmJfbWlpcGh5X3dyaXRlKTsKKyNlbmRpZgorCX0KKworCXJldHVybiAxOworfQorCisjaWZkZWYgQ09ORklHX0VUSEVSX0xPT1BCQUNLX1RFU1QKKworI2RlZmluZSBFTEJUX0JVRlNaCTEwMjQJLyogbXVzdCBiZSBtdWx0aXBsZSBvZiAzMiAqLworCisjZGVmaW5lIEVMQlRfQ1JDU1oJNAorCisjZGVmaW5lIEVMQlRfTlJYQkQJNAkvKiBtdXN0IGJlIGF0IGxlYXN0IDIgKi8KKyNkZWZpbmUgRUxCVF9OVFhCRAk0CisKKyNkZWZpbmUgRUxCVF9NQVhSWEVSUgkzMgorI2RlZmluZSBFTEJUX01BWFRYRVJSCTMyCisKKyNkZWZpbmUgRUxCVF9DTFNXQUlUCTEwMDAJLyogbXNlYyB0byB3YWl0IGZvciBmdXJ0aGVyIGlucHV0IGZyYW1lcyAqLworCit0eXBlZGVmCisJc3RydWN0IHsKKwkJdWludCBvZmY7CisJCWNoYXIgKmxhYjsKKwl9CitlbGJ0X3ByZGVzYzsKKwordHlwZWRlZgorCXN0cnVjdCB7CisJCXVpbnQgX2wsIF9mLCBtLCBiYywgbWMsIGxnLCBubywgc2gsIGNyLCBvdiwgY2w7CisJCXVpbnQgYmFkc3JjLCBiYWR0eXAsIGJhZGxlbiwgYmFkYml0OworCX0KK2VsYnRfcnhlYWNjOworCitzdGF0aWMgZWxidF9wcmRlc2MgcnhlYWNjX2Rlc2NzW10gPSB7CisJeyBvZmZzZXRvZihlbGJ0X3J4ZWFjYywgX2wpLAkJIk5vdCBMYXN0IGluIEZyYW1lIgl9LAorCXsgb2Zmc2V0b2YoZWxidF9yeGVhY2MsIF9mKSwJCSJOb3QgRmlyc3QgaW4gRnJhbWUiCX0sCisJeyBvZmZzZXRvZihlbGJ0X3J4ZWFjYywgbSksCQkiQWRkcmVzcyBNaXNzIgkJfSwKKwl7IG9mZnNldG9mKGVsYnRfcnhlYWNjLCBiYyksCQkiQnJvYWRjYXN0IEFkZHJlc3MiCX0sCisJeyBvZmZzZXRvZihlbGJ0X3J4ZWFjYywgbWMpLAkJIk11bHRpY2FzdCBBZGRyZXNzIgl9LAorCXsgb2Zmc2V0b2YoZWxidF9yeGVhY2MsIGxnKSwJCSJGcmFtZSBMZW5ndGggVmlvbGF0aW9uIn0sCisJeyBvZmZzZXRvZihlbGJ0X3J4ZWFjYywgbm8pLAkJIk5vbi1PY3RldCBBbGlnbm1lbnQiCX0sCisJeyBvZmZzZXRvZihlbGJ0X3J4ZWFjYywgc2gpLAkJIlNob3J0IEZyYW1lIgkJfSwKKwl7IG9mZnNldG9mKGVsYnRfcnhlYWNjLCBjciksCQkiQ1JDIEVycm9yIgkJfSwKKwl7IG9mZnNldG9mKGVsYnRfcnhlYWNjLCBvdiksCQkiT3ZlcnJ1biIJCX0sCisJeyBvZmZzZXRvZihlbGJ0X3J4ZWFjYywgY2wpLAkJIkNvbGxpc2lvbiIJCX0sCisJeyBvZmZzZXRvZihlbGJ0X3J4ZWFjYywgYmFkc3JjKSwJIkJhZCBTcmMgQWRkcmVzcyIJfSwKKwl7IG9mZnNldG9mKGVsYnRfcnhlYWNjLCBiYWR0eXApLAkiQmFkIEZyYW1lIFR5cGUiCX0sCisJeyBvZmZzZXRvZihlbGJ0X3J4ZWFjYywgYmFkbGVuKSwJIkJhZCBGcmFtZSBMZW5ndGgiCX0sCisJeyBvZmZzZXRvZihlbGJ0X3J4ZWFjYywgYmFkYml0KSwJIkRhdGEgQ29tcGFyZSBFcnJvcnMiCX0sCit9Oworc3RhdGljIGludCByeGVhY2NfbmRlc2MgPSBzaXplb2YgKHJ4ZWFjY19kZXNjcykgLyBzaXplb2YgKHJ4ZWFjY19kZXNjc1swXSk7CisKK3R5cGVkZWYKKwlzdHJ1Y3QgeworCQl1aW50IGRlZiwgaGIsIGxjLCBybCwgcmMsIHVuLCBjc2w7CisJfQorZWxidF90eGVhY2M7CisKK3N0YXRpYyBlbGJ0X3ByZGVzYyB0eGVhY2NfZGVzY3NbXSA9IHsKKwl7IG9mZnNldG9mKGVsYnRfdHhlYWNjLCBkZWYpLAkJIkRlZmVyIEluZGljYXRpb24iCX0sCisJeyBvZmZzZXRvZihlbGJ0X3R4ZWFjYywgaGIpLAkJIkhlYXJ0YmVhdCIJCX0sCisJeyBvZmZzZXRvZihlbGJ0X3R4ZWFjYywgbGMpLAkJIkxhdGUgQ29sbGlzaW9uIgl9LAorCXsgb2Zmc2V0b2YoZWxidF90eGVhY2MsIHJsKSwJCSJSZXRyYW5zbWlzc2lvbiBMaW1pdCIJfSwKKwl7IG9mZnNldG9mKGVsYnRfdHhlYWNjLCByYyksCQkiUmV0cnkgQ291bnQiCQl9LAorCXsgb2Zmc2V0b2YoZWxidF90eGVhY2MsIHVuKSwJCSJVbmRlcnJ1biIJCX0sCisJeyBvZmZzZXRvZihlbGJ0X3R4ZWFjYywgY3NsKSwJCSJDYXJyaWVyIFNlbnNlIExvc3QiCX0sCit9Oworc3RhdGljIGludCB0eGVhY2NfbmRlc2MgPSBzaXplb2YgKHR4ZWFjY19kZXNjcykgLyBzaXplb2YgKHR4ZWFjY19kZXNjc1swXSk7CisKK3R5cGVkZWYKKwlzdHJ1Y3QgeworCQl1Y2hhciByeGJ1ZnNbRUxCVF9OUlhCRF1bRUxCVF9CVUZTWl07CisJCXVjaGFyIHR4YnVmc1tFTEJUX05UWEJEXVtFTEJUX0JVRlNaXTsKKwkJY2JkX3QgcnhiZFtFTEJUX05SWEJEXTsKKwkJY2JkX3QgdHhiZFtFTEJUX05UWEJEXTsKKwkJZW51bSB7IElkbGUsIFJ1bm5pbmcsIENsb3NpbmcsIENsb3NlZCB9IHN0YXRlOworCQlpbnQgcHJvZmYsIHBhZ2UsIHNibG9jazsKKwkJdWludCBjbHN0aW1lLCBuc2VudCwgbnR4ZXJyLCBucmN2ZCwgbnJ4ZXJyOworCQl1c2hvcnQgcnhlcnJzW0VMQlRfTUFYUlhFUlJdLCB0eGVycnNbRUxCVF9NQVhUWEVSUl07CisJCWVsYnRfcnhlYWNjIHJ4ZWFjYzsKKwkJZWxidF90eGVhY2MgdHhlYWNjOworCX0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoOCkpKQorZWxidF9jaGFuOworCitzdGF0aWMgdWNoYXIgcGF0Ynl0ZXNbRUxCVF9OVFhCRF0gPSB7CisJMHhmZiwgMHhhYSwgMHg1NSwgMHgwMAorfTsKK3N0YXRpYyB1aW50IHBhdHdvcmRzW0VMQlRfTlRYQkRdID0geworCTB4ZmZmZmZmZmYsIDB4YWFhYWFhYWEsIDB4NTU1NTU1NTUsIDB4MDAwMDAwMDAKK307CisKKyNpZmRlZiBfX0dOVUNfXworc3RhdGljIGVsYnRfY2hhbiBlbGJ0X2NoYW5zWzNdIF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDgpKSk7CisjZWxzZQorI2Vycm9yICJlbGJ0X2NoYW5zIG11c3QgYmUgNjQtYml0IGFsaWduZWQiCisjZW5kaWYKKworI2RlZmluZSBDUE1fQ1JfR1JBQ0VGVUxfU1RPUF9UWAkoKHVzaG9ydCkweDAwMDUpCisKK3N0YXRpYyBlbGJ0X3ByZGVzYyBlcHJhbV9kZXNjc1tdID0geworCXsgb2Zmc2V0b2YoZmNjX2VuZXRfdCwgZmVuX2NyY2VjKSwJIkNSQyBFcnJvcnMiCQl9LAorCXsgb2Zmc2V0b2YoZmNjX2VuZXRfdCwgZmVuX2FsZWMpLAkiQWxpZ25tZW50IEVycm9ycyIJfSwKKwl7IG9mZnNldG9mKGZjY19lbmV0X3QsIGZlbl9kaXNmYyksCSJEaXNjYXJkZWQgRnJhbWVzIgl9LAorCXsgb2Zmc2V0b2YoZmNjX2VuZXRfdCwgZmVuX29jdGMpLAkiT2N0ZXRzIgkJfSwKKwl7IG9mZnNldG9mKGZjY19lbmV0X3QsIGZlbl9jb2xjKSwJIkNvbGxpc2lvbnMiCQl9LAorCXsgb2Zmc2V0b2YoZmNjX2VuZXRfdCwgZmVuX2Jyb2MpLAkiQnJvYWRjYXN0IEZyYW1lcyIJfSwKKwl7IG9mZnNldG9mKGZjY19lbmV0X3QsIGZlbl9tdWxjKSwJIk11bHRpY2FzdCBGcmFtZXMiCX0sCisJeyBvZmZzZXRvZihmY2NfZW5ldF90LCBmZW5fdXNwYyksCSJVbmRlcnNpemUgRnJhbWVzIgl9LAorCXsgb2Zmc2V0b2YoZmNjX2VuZXRfdCwgZmVuX2ZyZ2MpLAkiRnJhZ21lbnRzIgkJfSwKKwl7IG9mZnNldG9mKGZjY19lbmV0X3QsIGZlbl9vc3BjKSwJIk92ZXJzaXplIEZyYW1lcyIJfSwKKwl7IG9mZnNldG9mKGZjY19lbmV0X3QsIGZlbl9qYnJjKSwJIkphYmJlcnMiCQl9LAorCXsgb2Zmc2V0b2YoZmNjX2VuZXRfdCwgZmVuX3A2NGMpLAkiNjQgT2N0ZXQgRnJhbWVzIgl9LAorCXsgb2Zmc2V0b2YoZmNjX2VuZXRfdCwgZmVuX3A2NWMpLAkiNjUtMTI3IE9jdGV0IEZyYW1lcyIJfSwKKwl7IG9mZnNldG9mKGZjY19lbmV0X3QsIGZlbl9wMTI4YyksCSIxMjgtMjU1IE9jdGV0IEZyYW1lcyIJfSwKKwl7IG9mZnNldG9mKGZjY19lbmV0X3QsIGZlbl9wMjU2YyksCSIyNTYtNTExIE9jdGV0IEZyYW1lcyIJfSwKKwl7IG9mZnNldG9mKGZjY19lbmV0X3QsIGZlbl9wNTEyYyksCSI1MTItMTAyMyBPY3RldCBGcmFtZXMiCX0sCisJeyBvZmZzZXRvZihmY2NfZW5ldF90LCBmZW5fcDEwMjRjKSwJIjEwMjQtMTUxOCBPY3RldCBGcmFtZXMifSwKK307CitzdGF0aWMgaW50IGVwcmFtX25kZXNjID0gc2l6ZW9mIChlcHJhbV9kZXNjcykgLyBzaXplb2YgKGVwcmFtX2Rlc2NzWzBdKTsKKworLyoKKyAqIGdpdmVuIGFuIGVsYnRfcHJkZXNjIGFycmF5IGFuZCBhbiBhcnJheSBvZiBiYXNlIGFkZHJlc3NlcywgcHJpbnQKKyAqIGVhY2ggcHJkZXNjIGRvd24gdGhlIHNjcmVlbiB3aXRoIHRoZSB2YWx1ZXMgZmV0Y2hlZCBmcm9tIGVhY2gKKyAqIGJhc2UgYWRkcmVzcyBhY3Jvc3MgdGhlIHNjcmVlbgorICovCitzdGF0aWMgdm9pZAorcHJpbnRfZGVzYyAoZWxidF9wcmRlc2MgZGVzY3NbXSwgaW50IG5kZXNjLCB1Y2hhciAqYmFzZXNbXSwgaW50IG5iYXNlKQoreworCWVsYnRfcHJkZXNjICpkcCA9IGRlc2NzLCAqZWRwID0gZHAgKyBuZGVzYzsKKwlpbnQgaTsKKworCXByaW50ZiAoIiUzMnMiLCAiIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgbmJhc2U7IGkrKykKKwkJcHJpbnRmICgiICBDaGFubmVsICVkIiwgaSk7CisKKwlwdXRjICgnXG4nKTsKKworCXdoaWxlIChkcCA8IGVkcCkgeworCisJCXByaW50ZiAoIiUtMzJzIiwgZHAtPmxhYik7CisKKwkJZm9yIChpID0gMDsgaSA8IG5iYXNlOyBpKyspIHsKKwkJCXVpbnQgdmFsID0gKih1aW50ICopKGJhc2VzW2ldICsgZHAtPm9mZik7CisKKwkJCXByaW50ZiAoIiAlMTB1IiwgdmFsKTsKKwkJfQorCisJCXB1dGMgKCdcbicpOworCisJCWRwKys7CisJfQorfQorCisvKgorICogcmV0dXJuIG51bWJlciBvZiBiaXRzIHRoYXQgYXJlIHNldCBpbiBhIHZhbHVlOyB2YWx1ZSBjb250YWlucworICogbmJpdHMgKHJpZ2h0LWp1c3RpZmllZCkgYml0cy4KKyAqLworc3RhdGljIHVpbnQgX19pbmxpbmVfXworbmJzICh1aW50IHZhbHVlLCB1aW50IG5iaXRzKQoreworCXVpbnQgY250ID0gMDsKKyNpZiAxCisJdWludCBwb3MgPSBzaXplb2YgKHVpbnQpICogODsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICgiXAorCW10Y3RyCSUyXG5cCisxOglybHdubS4JJTIsJTEsJTQsMzEsMzFcblwKKwliZXEJMmZcblwKKwlhZGRpCSUwLCUwLDFcblwKKzI6CXN1YmkJJTQsJTQsMVxuXAorCWJkbnoJMWIiCisJOiAiPXIiKGNudCkKKwk6ICJyIih2YWx1ZSksICJyIihuYml0cyksICJyIihjbnQpLCAiciIocG9zKQorCTogImN0ciIsICJjYyIgKTsKKyNlbHNlCisJdWludCBtYXNrID0gMTsKKworCWRvIHsKKwkJaWYgKHZhbHVlICYgbWFzaykKKwkJCWNudCsrOworCQltYXNrIDw8PSAxOworCX0gd2hpbGUgKC0tbmJpdHMpOworI2VuZGlmCisKKwlyZXR1cm4gKGNudCk7Cit9CisKK3N0YXRpYyB1bG9uZworYmFkYml0cyAodWNoYXIgKmJwLCBpbnQgbiwgdWxvbmcgcGF0KQoreworCXVsb25nICpscCwgY250ID0gMDsKKwlpbnQgbmw7CisKKwl3aGlsZSAobiA+IDAgJiYgKCh1bG9uZylicCAmIChzaXplb2YgKHVsb25nKSAtIDEpKSAhPSAwKSB7CisJCXVjaGFyIGRpZmY7CisKKwkJZGlmZiA9ICpicCsrIF4gKHVjaGFyKXBhdDsKKworCQlpZiAoZGlmZikKKwkJCWNudCArPSBuYnMgKCh1bG9uZylkaWZmLCA4KTsKKworCQluLS07CisJfQorCisJbHAgPSAodWxvbmcgKilicDsKKwlubCA9IG4gLyBzaXplb2YgKHVsb25nKTsKKwluIC09IG5sICogc2l6ZW9mICh1bG9uZyk7CisKKwl3aGlsZSAobmwgPiAwKSB7CisJCXVsb25nIGRpZmY7CisKKwkJZGlmZiA9ICpscCsrIF4gcGF0OworCisJCWlmIChkaWZmKQorCQkJY250ICs9IG5icyAoZGlmZiwgMzIpOworCisJCW5sLS07CisJfQorCisJYnAgPSAodWNoYXIgKilscDsKKworCXdoaWxlIChuID4gMCkgeworCQl1Y2hhciBkaWZmOworCisJCWRpZmYgPSAqYnArKyBeICh1Y2hhcilwYXQ7CisKKwkJaWYgKGRpZmYpCisJCQljbnQgKz0gbmJzICgodWxvbmcpZGlmZiwgOCk7CisKKwkJbi0tOworCX0KKworCXJldHVybiAoY250KTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydAorc3dhcDE2ICh1bnNpZ25lZCBzaG9ydCB4KQoreworCXJldHVybiAoKCh4ICYgMHhmZikgPDwgOCkgfCAoKHggJiAweGZmMDApID4+IDgpKTsKK30KKworLyogYnJvYWRjYXN0IGlzIG5vdCBhbiBlcnJvciAtIHdlIHNlbmQgdGhlbSBsaWtlIHRoYXQgKi8KKyNkZWZpbmUgQkRfRU5FVF9SWF9FUlJTCShCRF9FTkVUX1JYX1NUQVRTICYgfkJEX0VORVRfUlhfQkMpCisKK3ZvaWQKK2V0aF9sb29wYmFja190ZXN0ICh2b2lkKQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltbXIgPSAoaW1tYXBfdCAqKUNPTkZJR19TWVNfSU1NUjsKKwl2b2xhdGlsZSBjcG04MjYwX3QgKmNwID0gJihpbW1yLT5pbV9jcG0pOworCWludCBjLCBuY2xvc2VkOworCXVsb25nIHJ1bnRpbWUsIG5tc2VjOworCXVjaGFyICpiYXNlc1szXTsKKworCXB1dHMgKCJGQ0MgRXRoZXJuZXQgRXh0ZXJuYWwgbG9vcGJhY2sgdGVzdFxuIik7CisKKwlldGhfZ2V0ZW52X2VuZXRhZGRyKCJldGhhZGRyIiwgTmV0T3VyRXRoZXIpOworCisJLyoKKwkgKiBnbG9iYWwgaW5pdGlhbGlzYXRpb25zIGZvciBhbGwgRkNDIGNoYW5uZWxzCisJICovCisKKwkvKiAyOC45IC0gKDEtMik6IGlvcG9ydHMgaGF2ZSBiZWVuIHNldCB1cCBhbHJlYWR5ICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19IWU1PRCkKKwkvKgorCSAqIEF0dGVudGlvbjogdGhpcyBpcyBib2FyZC1zcGVjaWZpYworCSAqIDAsIEZDQzEKKwkgKiAxLCBGQ0MyCisJICogMiwgRkNDMworCSAqLworIyAgICAgICBkZWZpbmUgRkNDX1NUQVJUX0xPT1AgMAorIyAgICAgICBkZWZpbmUgRkNDX0VORF9MT09QICAgMgorCisJLyoKKwkgKiBBdHRlbnRpb246IHRoaXMgaXMgYm9hcmQtc3BlY2lmaWMKKwkgKiAtIEZDQzEgUngtQ0xLIGlzIENMSzEwCisJICogLSBGQ0MxIFR4LUNMSyBpcyBDTEsxMQorCSAqIC0gRkNDMiBSeC1DTEsgaXMgQ0xLMTMKKwkgKiAtIEZDQzIgVHgtQ0xLIGlzIENMSzE0CisJICogLSBGQ0MzIFJ4LUNMSyBpcyBDTEsxNQorCSAqIC0gRkNDMyBUeC1DTEsgaXMgQ0xLMTYKKwkgKi8KKworCS8qIDI4LjkgLSAoMyk6IGNvbm5lY3QgRkNDJ3MgdHggYW5kIHJ4IGNsb2NrcyAqLworCWltbXItPmltX2NwbXV4LmNteF91YXIgPSAwOworCWltbXItPmltX2NwbXV4LmNteF9mY3IgPSBDTVhGQ1JfUkYxQ1NfQ0xLMTB8Q01YRkNSX1RGMUNTX0NMSzExfFwKKwkgICAgQ01YRkNSX1JGMkNTX0NMSzEzfENNWEZDUl9URjJDU19DTEsxNHxcCisJICAgIENNWEZDUl9SRjNDU19DTEsxNXxDTVhGQ1JfVEYzQ1NfQ0xLMTY7CisjZWxpZiBkZWZpbmVkKENPTkZJR19TQkM4MjYwKSB8fCBkZWZpbmVkKENPTkZJR19TQUNTbmcpCisJLyoKKwkgKiBBdHRlbnRpb246IHRoaXMgaXMgYm9hcmQtc3BlY2lmaWMKKwkgKiAxLCBGQ0MyCisJICovCisjICAgICAgIGRlZmluZSBGQ0NfU1RBUlRfTE9PUCAxCisjICAgICAgIGRlZmluZSBGQ0NfRU5EX0xPT1AgICAxCisKKwkvKgorCSAqIEF0dGVudGlvbjogdGhpcyBpcyBib2FyZC1zcGVjaWZpYworCSAqIC0gRkNDMiBSeC1DTEsgaXMgQ0xLMTMKKwkgKiAtIEZDQzIgVHgtQ0xLIGlzIENMSzE0CisJICovCisKKwkvKiAyOC45IC0gKDMpOiBjb25uZWN0IEZDQydzIHR4IGFuZCByeCBjbG9ja3MgKi8KKwlpbW1yLT5pbV9jcG11eC5jbXhfdWFyID0gMDsKKwlpbW1yLT5pbV9jcG11eC5jbXhfZmNyID0gQ01YRkNSX1JGMkNTX0NMSzEzfENNWEZDUl9URjJDU19DTEsxNDsKKyNlbHNlCisjZXJyb3IgImV0aF9sb29wYmFja190ZXN0IG5vdCBzdXBwb3J0ZWQgb24geW91ciBib2FyZCIKKyNlbmRpZgorCisJcHV0cyAoIkluaXRpYWxpc2UgRkNDIGNoYW5uZWxzOiIpOworCisJZm9yIChjID0gRkNDX1NUQVJUX0xPT1A7IGMgPD0gRkNDX0VORF9MT09QOyBjKyspIHsKKwkJZWxidF9jaGFuICplY3AgPSAmZWxidF9jaGFuc1tjXTsKKwkJdm9sYXRpbGUgZmNjX3QgKmZjcCA9ICZpbW1yLT5pbV9mY2NbY107CisJCXZvbGF0aWxlIGZjY19lbmV0X3QgKmZwcDsKKwkJaW50IGk7CisJCXVsb25nIGFkZHI7CisKKwkJLyoKKwkJICogaW5pdGlhbGlzZSBjaGFubmVsIGRhdGEKKwkJICovCisKKwkJcHJpbnRmICgiICVkIiwgYyk7CisKKwkJbWVtc2V0ICgodm9pZCAqKWVjcCwgMCwgc2l6ZW9mICgqZWNwKSk7CisKKwkJZWNwLT5zdGF0ZSA9IElkbGU7CisKKwkJc3dpdGNoIChjKSB7CisKKwkJY2FzZSAwOiAvKiBGQ0MxICovCisJCQllY3AtPnByb2ZmID0gUFJPRkZfRkNDMTsKKwkJCWVjcC0+cGFnZSA9IENQTV9DUl9GQ0MxX1BBR0U7CisJCQllY3AtPnNibG9jayA9IENQTV9DUl9GQ0MxX1NCTE9DSzsKKwkJCWJyZWFrOworCisJCWNhc2UgMTogLyogRkNDMiAqLworCQkJZWNwLT5wcm9mZiA9IFBST0ZGX0ZDQzI7CisJCQllY3AtPnBhZ2UgPSBDUE1fQ1JfRkNDMl9QQUdFOworCQkJZWNwLT5zYmxvY2sgPSBDUE1fQ1JfRkNDMl9TQkxPQ0s7CisJCQlicmVhazsKKworCQljYXNlIDI6IC8qIEZDQzMgKi8KKwkJCWVjcC0+cHJvZmYgPSBQUk9GRl9GQ0MzOworCQkJZWNwLT5wYWdlID0gQ1BNX0NSX0ZDQzNfUEFHRTsKKwkJCWVjcC0+c2Jsb2NrID0gQ1BNX0NSX0ZDQzNfU0JMT0NLOworCQkJYnJlYWs7CisJCX0KKworCQkvKgorCQkgKiBzZXQgdXAgdHggYnVmZmVycyBhbmQgYmRzCisJCSAqLworCisJCWZvciAoaSA9IDA7IGkgPCBFTEJUX05UWEJEOyBpKyspIHsKKwkJCWNiZF90ICpiZHAgPSAmZWNwLT50eGJkW2ldOworCQkJdWNoYXIgKmJwID0gJmVjcC0+dHhidWZzW2ldWzBdOworCisJCQliZHAtPmNiZF9idWZhZGRyID0gKHVpbnQpYnA7CisJCQkvKiByb29tIGZvciBjcmMgKi8KKwkJCWJkcC0+Y2JkX2RhdGxlbiA9IEVMQlRfQlVGU1ogLSBFTEJUX0NSQ1NaOworCQkJYmRwLT5jYmRfc2MgPSBCRF9FTkVUX1RYX1JFQURZIHwgQkRfRU5FVF9UWF9QQUQgfCBcCisJCQkJQkRfRU5FVF9UWF9MQVNUIHwgQkRfRU5FVF9UWF9UQzsKKworCQkJbWVtc2V0ICgodm9pZCAqKWJwLCBwYXRieXRlc1tpXSwgRUxCVF9CVUZTWik7CisJCQlOZXRTZXRFdGhlciAoYnAsIE5ldEJjYXN0QWRkciwgMHg4MDAwKTsKKwkJfQorCQllY3AtPnR4YmRbRUxCVF9OVFhCRCAtIDFdLmNiZF9zYyB8PSBCRF9FTkVUX1RYX1dSQVA7CisKKwkJLyoKKwkJICogc2V0IHVwIHJ4IGJ1ZmZlcnMgYW5kIGJkcworCQkgKi8KKworCQlmb3IgKGkgPSAwOyBpIDwgRUxCVF9OUlhCRDsgaSsrKSB7CisJCSAgICBjYmRfdCAqYmRwID0gJmVjcC0+cnhiZFtpXTsKKwkJICAgIHVjaGFyICpicCA9ICZlY3AtPnJ4YnVmc1tpXVswXTsKKworCQkgICAgYmRwLT5jYmRfYnVmYWRkciA9ICh1aW50KWJwOworCQkgICAgYmRwLT5jYmRfZGF0bGVuID0gMDsKKwkJICAgIGJkcC0+Y2JkX3NjID0gQkRfRU5FVF9SWF9FTVBUWTsKKworCQkgICAgbWVtc2V0ICgodm9pZCAqKWJwLCAwLCBFTEJUX0JVRlNaKTsKKwkJfQorCQllY3AtPnJ4YmRbRUxCVF9OUlhCRCAtIDFdLmNiZF9zYyB8PSBCRF9FTkVUX1JYX1dSQVA7CisKKwkJLyoKKwkJICogc2V0IHVwIHRoZSBGQ0MgY2hhbm5lbCBoYXJkd2FyZQorCQkgKi8KKworCQkvKiAyOC45IC0gKDQpOiBHRk1SOiBkaXNhYmxlIHR4L3J4LCBDQ0lUVCBDUkMsIE1vZGUgRXRoZXJuZXQgKi8KKwkJZmNwLT5mY2NfZ2ZtciA9IEZDQ19HRk1SX01PREVfRU5FVCB8IEZDQ19HRk1SX1RDUkNfMzI7CisKKwkJLyogMjguOSAtICg1KTogRlBTTVI6IGZkLCBlbmV0IENSQywgUHJvbWlzLCBSTU9OLCBSeCBTSG9ydCAqLworCQlmY3AtPmZjY19mcHNtciA9IEZDQ19QU01SX0ZERSB8IEZDQ19QU01SX0xQQiB8IFwKKwkJCUZDQ19QU01SX0VOQ1JDIHwgRkNDX1BTTVJfUFJPIHwgXAorCQkJRkNDX1BTTVJfTU9OIHwgRkNDX1BTTVJfUlNIOworCisJCS8qIDI4LjkgLSAoNik6IEZEU1I6IEV0aGVybmV0IFN5biAqLworCQlmY3AtPmZjY19mZHNyID0gMHhENTU1OworCisJCS8qIDI5LjkgLSAoNyk6IGluaXRpYWxpc2UgcGFyYW1ldGVyIHJhbSAqLworCQlmcHAgPSAoZmNjX2VuZXRfdCAqKSYoaW1tci0+aW1fZHByYW1iYXNlW2VjcC0+cHJvZmZdKTsKKworCQkvKiBjbGVhciB3aG9sZSBzdHJ1Y3QgdG8gbWFrZSBzdXJlIGFsbCByZXN2IGZpZWxkcyBhcmUgemVybyAqLworCQltZW1zZXQgKCh2b2lkICopZnBwLCAwLCBzaXplb2YgKGZjY19lbmV0X3QpKTsKKworCQkvKgorCQkgKiBjb21tb24gUGFyYW1ldGVyIFJBTSBhcmVhCisJCSAqCisJCSAqIEFsbG9jYXRlIHNwYWNlIGluIHRoZSByZXNlcnZlZCBGQ0MgYXJlYSBvZiBEUFJBTSBmb3IgdGhlCisJCSAqIGludGVybmFsIGJ1ZmZlcnMuICBObyBvbmUgdXNlcyB0aGlzIHNwYWNlICh5ZXQpLCBzbyB3ZQorCQkgKiBjYW4gZG8gdGhpcy4gIExhdGVyLCB3ZSB3aWxsIGFkZCByZXNvdXJjZSBtYW5hZ2VtZW50IGZvcgorCQkgKiB0aGlzIGFyZWEuCisJCSAqLworCQlhZGRyID0gQ1BNX0ZDQ19TUEVDSUFMX0JBU0UgKyAoYyAqIDY0KTsKKwkJZnBwLT5mZW5fZ2VuZmNjLmZjY19yaXB0ciA9IGFkZHI7CisJCWZwcC0+ZmVuX2dlbmZjYy5mY2NfdGlwdHIgPSBhZGRyICsgMzI7CisKKwkJLyoKKwkJICogU2V0IG1heGltdW0gYnl0ZXMgcGVyIHJlY2VpdmUgYnVmZmVyLgorCQkgKiBJdCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMzIuCisJCSAqIGJ1ZmZlcnMgYXJlIGluIDYweCBidXMgbWVtb3J5LgorCQkgKi8KKwkJZnBwLT5mZW5fZ2VuZmNjLmZjY19tcmJsciA9IFBLVF9NQVhCTFJfU0laRTsKKwkJZnBwLT5mZW5fZ2VuZmNjLmZjY19yc3RhdGUgPSAoQ1BNRkNSX0dCTCB8IENQTUZDUl9FQikgPDwgMjQ7CisJCWZwcC0+ZmVuX2dlbmZjYy5mY2NfcmJhc2UgPSAodW5zaWduZWQgaW50KSgmZWNwLT5yeGJkWzBdKTsKKwkJZnBwLT5mZW5fZ2VuZmNjLmZjY190c3RhdGUgPSAoQ1BNRkNSX0dCTCB8IENQTUZDUl9FQikgPDwgMjQ7CisJCWZwcC0+ZmVuX2dlbmZjYy5mY2NfdGJhc2UgPSAodW5zaWduZWQgaW50KSgmZWNwLT50eGJkWzBdKTsKKworCQkvKiBwcm90b2NvbC1zcGVjaWZpYyBhcmVhICovCisJCWZwcC0+ZmVuX2NtYXNrID0gMHhkZWJiMjBlMzsJLyogQ1JDIG1hc2sgKi8KKwkJZnBwLT5mZW5fY3ByZXMgPSAweGZmZmZmZmZmOwkvKiBDUkMgcHJlc2V0ICovCisJCWZwcC0+ZmVuX3JldGxpbSA9IDE1OwkJLyogUmV0cnkgbGltaXQgdGhyZXNob2xkICovCisJCWZwcC0+ZmVuX21mbHIgPSBQS1RfTUFYQlVGX1NJWkU7LyogbWF4IGZyYW1lIGxlbmd0aCByZWdpc3RlciAqLworCisJCS8qCisJCSAqIFNldCBFdGhlcm5ldCBzdGF0aW9uIGFkZHJlc3MuCisJCSAqCisJCSAqIFRoaXMgaXMgc3VwcGxpZWQgaW4gdGhlIGJvYXJkIGluZm9ybWF0aW9uIHN0cnVjdHVyZSwgc28gd2UKKwkJICogY29weSB0aGF0IGludG8gdGhlIGNvbnRyb2xsZXIuCisJCSAqIFNvLCBmYXIgd2UgaGF2ZSBvbmx5IGJlZW4gZ2l2ZW4gb25lIEV0aGVybmV0IGFkZHJlc3MuIFdlIHVzZQorCQkgKiB0aGUgc2FtZSBhZGRyZXNzIGZvciBhbGwgY2hhbm5lbHMKKwkJICovCisjZGVmaW5lIGVhIE5ldE91ckV0aGVyCisJCWZwcC0+ZmVuX3BhZGRyaCA9IChlYVs1XSA8PCA4KSArIGVhWzRdOworCQlmcHAtPmZlbl9wYWRkcm0gPSAoZWFbM10gPDwgOCkgKyBlYVsyXTsKKwkJZnBwLT5mZW5fcGFkZHJsID0gKGVhWzFdIDw8IDgpICsgZWFbMF07CisjdW5kZWYgZWEKKworCQlmcHAtPmZlbl9taW5mbHIgPSBQS1RfTUlOQlVGX1NJWkU7IC8qIG1pbiBmcmFtZSBsZW4gcmVnaXN0ZXIgKi8KKwkJLyoKKwkJICogcGFkIHBvaW50ZXIuIHVzZSB0aXB0ciBzaW5jZSB3ZSBkb24ndCBuZWVkCisJCSAqIGEgc3BlY2lmaWMgcGFkZGluZyBjaGFyCisJCSAqLworCQlmcHAtPmZlbl9wYWRwdHIgPSBmcHAtPmZlbl9nZW5mY2MuZmNjX3RpcHRyOworCQlmcHAtPmZlbl9tYXhkMSA9IFBLVF9NQVhETUFfU0laRTsJLyogbWF4IERNQTEgbGVuZ3RoICovCisJCWZwcC0+ZmVuX21heGQyID0gUEtUX01BWERNQV9TSVpFOwkvKiBtYXggRE1BMiBsZW5ndGggKi8KKwkJZnBwLT5mZW5fcmZ0aHIgPSAxOworCQlmcHAtPmZlbl9yZmNudCA9IDE7CisKKwkJLyogMjguOSAtICg4KTogY2xlYXIgb3V0IGV2ZW50cyBpbiBGQ0NFICovCisJCWZjcC0+ZmNjX2ZjY2UgPSB+MHgwOworCisJCS8qIDI4LjkgLSAoOSk6IEZDQ006IG1hc2sgYWxsIGV2ZW50cyAqLworCQlmY3AtPmZjY19mY2NtID0gMDsKKworCQkvKiAyOC45IC0gKDEwLTEyKTogd2UgZG9uJ3QgdXNlIGV0aGVybmV0IGludGVycnVwdHMgKi8KKworCQkvKiAyOC45IC0gKDEzKQorCQkgKgorCQkgKiBMZXQncyByZS1pbml0aWFsaXplIHRoZSBjaGFubmVsIG5vdy4gIFdlIGhhdmUgdG8gZG8gaXQgbGF0ZXIKKwkJICogdGhhbiB0aGUgbWFudWFsIGRlc2NyaWJlcyBiZWNhdXNlIHdlIGhhdmUganVzdCBub3cgZmluaXNoZWQKKwkJICogdGhlIEJEIGluaXRpYWxpemF0aW9uLgorCQkgKi8KKwkJY3AtPmNwX2NwY3IgPSBta19jcl9jbWQgKGVjcC0+cGFnZSwgZWNwLT5zYmxvY2ssIFwKKwkJCTB4MGMsIENQTV9DUl9JTklUX1RSWCkgfCBDUE1fQ1JfRkxHOworCQlkbyB7CisJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImVpZWlvIik7CisJCX0gd2hpbGUgKGNwLT5jcF9jcGNyICYgQ1BNX0NSX0ZMRyk7CisJfQorCisJcHV0cyAoIiBkb25lXG5TdGFydGluZyB0ZXN0Li4uIChDdHJsLUMgdG8gRmluaXNoKVxuIik7CisKKwkvKgorCSAqIE5vdGU6IGRvbid0IHdhbnQgc2VyaWFsIG91dHB1dCBmcm9tIGhlcmUgdW50aWwgdGhlIGVuZCBvZiB0aGUKKwkgKiB0ZXN0IC0gdGhlIGRlbGF5cyB3b3VsZCBwcm9iYWJseSBzdHVmZiB0aGluZ3MgdXAuCisJICovCisKKwljbGVhcl9jdHJsYyAoKTsKKwlydW50aW1lID0gZ2V0X3RpbWVyICgwKTsKKworCWRvIHsKKwkJbmNsb3NlZCA9IDA7CisKKwkJZm9yIChjID0gRkNDX1NUQVJUX0xPT1A7IGMgPD0gRkNDX0VORF9MT09QOyBjKyspIHsKKwkJCXZvbGF0aWxlIGZjY190ICpmY3AgPSAmaW1tci0+aW1fZmNjW2NdOworCQkJZWxidF9jaGFuICplY3AgPSAmZWxidF9jaGFuc1tjXTsKKwkJCWludCBpOworCisJCQlzd2l0Y2ggKGVjcC0+c3RhdGUpIHsKKworCQkJY2FzZSBJZGxlOgorCQkJCS8qCisJCQkJICogc2V0IHRoZSBjaGFubmVsIFJ1bm5pbmcgLi4uCisJCQkJICovCisKKwkJCQkvKiAyOC45IC0gKDE0KTogZW5hYmxlIHR4L3J4IGluIGdmbXIgKi8KKwkJCQlmY3AtPmZjY19nZm1yIHw9IEZDQ19HRk1SX0VOVCB8IEZDQ19HRk1SX0VOUjsKKworCQkJCWVjcC0+c3RhdGUgPSBSdW5uaW5nOworCQkJCWJyZWFrOworCisJCQljYXNlIFJ1bm5pbmc6CisJCQkJLyoKKwkJCQkgKiAod2hpbGUgUnVubmluZyBvbmx5KSBjaGVjayBmb3IKKwkJCQkgKiB0ZXJtaW5hdGlvbiBvZiB0aGUgdGVzdAorCQkJCSAqLworCisJCQkJKHZvaWQpY3RybGMgKCk7CisKKwkJCQlpZiAoaGFkX2N0cmxjICgpKSB7CisJCQkJCS8qCisJCQkJCSAqIGluaXRpYXRlIGEgImdyYWNlZnVsIHN0b3AgdHJhbnNtaXQiCisJCQkJCSAqIG9uIHRoZSBjaGFubmVsCisJCQkJCSAqLworCQkJCQljcC0+Y3BfY3BjciA9IG1rX2NyX2NtZCAoZWNwLT5wYWdlLCBcCisJCQkJCQllY3AtPnNibG9jaywgMHgwYywgXAorCQkJCQkJQ1BNX0NSX0dSQUNFRlVMX1NUT1BfVFgpIHwgXAorCQkJCQkJQ1BNX0NSX0ZMRzsKKwkJCQkJZG8geworCQkJCQkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJlaWVpbyIpOworCQkJCQl9IHdoaWxlIChjcC0+Y3BfY3BjciAmIENQTV9DUl9GTEcpOworCisJCQkJCWVjcC0+Y2xzdGltZSA9IGdldF90aW1lciAoMCk7CisJCQkJCWVjcC0+c3RhdGUgPSBDbG9zaW5nOworCQkJCX0KKwkJCQkvKiBmYWxsIHRocm91Z2ggLi4uICovCisKKwkJCWNhc2UgQ2xvc2luZzoKKwkJCQkvKgorCQkJCSAqICh3aGlsZSBSdW5uaW5nIG9yIENsb3NpbmcpIHBvbGwgdGhlIGNoYW5uZWw6CisJCQkJICogLSBjaGVjayBmb3IgYW55IG5vbi1SRUFEWSB0eCBidWZmZXJzIGFuZAorCQkJCSAqICAgbWFrZSB0aGVtIHJlYWR5CisJCQkJICogLSBjaGVjayBmb3IgYW55IG5vbi1FTVBUWSByeCBidWZmZXJzIGFuZAorCQkJCSAqICAgY2hlY2sgdGhhdCB0aGV5IHdlcmUgcmVjZWl2ZWQgY29ycmVjdGx5LAorCQkJCSAqICAgYWRqdXN0IGNvdW50ZXJzIGV0YywgdGhlbiBtYWtlIGVtcHR5CisJCQkJICovCisKKwkJCQlmb3IgKGkgPSAwOyBpIDwgRUxCVF9OVFhCRDsgaSsrKSB7CisJCQkJCWNiZF90ICpiZHAgPSAmZWNwLT50eGJkW2ldOworCQkJCQl1c2hvcnQgc2MgPSBiZHAtPmNiZF9zYzsKKworCQkJCQlpZiAoKHNjICYgQkRfRU5FVF9UWF9SRUFEWSkgIT0gMCkKKwkJCQkJCWNvbnRpbnVlOworCisJCQkJCS8qCisJCQkJCSAqIHRoaXMgZnJhbWUgaGFzIGZpbmlzaGVkCisJCQkJCSAqIHRyYW5zbWl0dGluZworCQkJCQkgKi8KKwkJCQkJZWNwLT5uc2VudCsrOworCisJCQkJCWlmIChzYyAmIEJEX0VORVRfVFhfU1RBVFMpIHsKKwkJCQkJCXVsb25nIG47CisKKwkJCQkJCS8qCisJCQkJCQkgKiB3ZSBoYWQgYW4gZXJyb3Igb24KKwkJCQkJCSAqIHRoZSB0cmFuc21pc3Npb24KKwkJCQkJCSAqLworCQkJCQkJbiA9IGVjcC0+bnR4ZXJyKys7CisJCQkJCQlpZiAobiA8IEVMQlRfTUFYVFhFUlIpCisJCQkJCQkJZWNwLT50eGVycnNbbl0gPSBzYzsKKworCQkJCQkJaWYgKHNjICYgQkRfRU5FVF9UWF9ERUYpCisJCQkJCQkJZWNwLT50eGVhY2MuZGVmKys7CisJCQkJCQlpZiAoc2MgJiBCRF9FTkVUX1RYX0hCKQorCQkJCQkJCWVjcC0+dHhlYWNjLmhiKys7CisJCQkJCQlpZiAoc2MgJiBCRF9FTkVUX1RYX0xDKQorCQkJCQkJCWVjcC0+dHhlYWNjLmxjKys7CisJCQkJCQlpZiAoc2MgJiBCRF9FTkVUX1RYX1JMKQorCQkJCQkJCWVjcC0+dHhlYWNjLnJsKys7CisJCQkJCQlpZiAoc2MgJiBCRF9FTkVUX1RYX1JDTUFTSykKKwkJCQkJCQllY3AtPnR4ZWFjYy5yYysrOworCQkJCQkJaWYgKHNjICYgQkRfRU5FVF9UWF9VTikKKwkJCQkJCQllY3AtPnR4ZWFjYy51bisrOworCQkJCQkJaWYgKHNjICYgQkRfRU5FVF9UWF9DU0wpCisJCQkJCQkJZWNwLT50eGVhY2MuY3NsKys7CisKKwkJCQkJCWJkcC0+Y2JkX3NjICY9IFwKKwkJCQkJCQl+QkRfRU5FVF9UWF9TVEFUUzsKKwkJCQkJfQorCisJCQkJCWlmIChlY3AtPnN0YXRlID09IENsb3NpbmcpCisJCQkJCQllY3AtPmNsc3RpbWUgPSBnZXRfdGltZXIgKDApOworCisJCQkJCS8qIG1ha2UgaXQgcmVhZHkgYWdhaW4gKi8KKwkJCQkJYmRwLT5jYmRfc2MgfD0gQkRfRU5FVF9UWF9SRUFEWTsKKwkJCQl9CisKKwkJCQlmb3IgKGkgPSAwOyBpIDwgRUxCVF9OUlhCRDsgaSsrKSB7CisJCQkJCWNiZF90ICpiZHAgPSAmZWNwLT5yeGJkW2ldOworCQkJCQl1c2hvcnQgc2MgPSBiZHAtPmNiZF9zYywgbWFzazsKKworCQkJCQlpZiAoKHNjICYgQkRfRU5FVF9SWF9FTVBUWSkgIT0gMCkKKwkJCQkJCWNvbnRpbnVlOworCisJCQkJCS8qIHdlIGhhdmUgYSBuZXcgZnJhbWUgaW4gdGhpcyBidWZmZXIgKi8KKwkJCQkJZWNwLT5ucmN2ZCsrOworCisJCQkJCW1hc2sgPSBCRF9FTkVUX1JYX0xBU1R8QkRfRU5FVF9SWF9GSVJTVDsKKwkJCQkJaWYgKChzYyAmIG1hc2spICE9IG1hc2spIHsKKwkJCQkJCS8qIHNvbWV0aGluZ3Mgd3JvbmcgaGVyZSAuLi4gKi8KKwkJCQkJCWlmICghKHNjICYgQkRfRU5FVF9SWF9MQVNUKSkKKwkJCQkJCQllY3AtPnJ4ZWFjYy5fbCsrOworCQkJCQkJaWYgKCEoc2MgJiBCRF9FTkVUX1JYX0ZJUlNUKSkKKwkJCQkJCQllY3AtPnJ4ZWFjYy5fZisrOworCQkJCQl9CisKKwkJCQkJaWYgKHNjICYgQkRfRU5FVF9SWF9FUlJTKSB7CisJCQkJCQl1bG9uZyBuOworCisJCQkJCQkvKgorCQkJCQkJICogd2UgaGFkIHNvbWUgc29ydCBvZiBlcnJvcgorCQkJCQkJICogb24gdGhlIGZyYW1lCisJCQkJCQkgKi8KKwkJCQkJCW4gPSBlY3AtPm5yeGVycisrOworCQkJCQkJaWYgKG4gPCBFTEJUX01BWFJYRVJSKQorCQkJCQkJCWVjcC0+cnhlcnJzW25dID0gc2M7CisKKwkJCQkJCWlmIChzYyAmIEJEX0VORVRfUlhfTUlTUykKKwkJCQkJCQllY3AtPnJ4ZWFjYy5tKys7CisJCQkJCQlpZiAoc2MgJiBCRF9FTkVUX1JYX0JDKQorCQkJCQkJCWVjcC0+cnhlYWNjLmJjKys7CisJCQkJCQlpZiAoc2MgJiBCRF9FTkVUX1JYX01DKQorCQkJCQkJCWVjcC0+cnhlYWNjLm1jKys7CisJCQkJCQlpZiAoc2MgJiBCRF9FTkVUX1JYX0xHKQorCQkJCQkJCWVjcC0+cnhlYWNjLmxnKys7CisJCQkJCQlpZiAoc2MgJiBCRF9FTkVUX1JYX05PKQorCQkJCQkJCWVjcC0+cnhlYWNjLm5vKys7CisJCQkJCQlpZiAoc2MgJiBCRF9FTkVUX1JYX1NIKQorCQkJCQkJCWVjcC0+cnhlYWNjLnNoKys7CisJCQkJCQlpZiAoc2MgJiBCRF9FTkVUX1JYX0NSKQorCQkJCQkJCWVjcC0+cnhlYWNjLmNyKys7CisJCQkJCQlpZiAoc2MgJiBCRF9FTkVUX1JYX09WKQorCQkJCQkJCWVjcC0+cnhlYWNjLm92Kys7CisJCQkJCQlpZiAoc2MgJiBCRF9FTkVUX1JYX0NMKQorCQkJCQkJCWVjcC0+cnhlYWNjLmNsKys7CisKKwkJCQkJCWJkcC0+Y2JkX3NjICY9IFwKKwkJCQkJCQl+QkRfRU5FVF9SWF9FUlJTOworCQkJCQl9CisJCQkJCWVsc2UgeworCQkJCQkJdXNob3J0IGRhdGxlbiA9IGJkcC0+Y2JkX2RhdGxlbjsKKwkJCQkJCUV0aGVybmV0X3QgKmVocDsKKwkJCQkJCXVzaG9ydCBwcm90OworCQkJCQkJaW50IG91cnMsIHRiLCBuLCBuYnl0ZXM7CisKKwkJCQkJCWVocCA9IChFdGhlcm5ldF90ICopIFwKKwkJCQkJCQkmZWNwLT5yeGJ1ZnNbaV1bMF07CisKKwkJCQkJCW91cnMgPSBtZW1jbXAgKGVocC0+ZXRfc3JjLCBcCisJCQkJCQkJTmV0T3VyRXRoZXIsIDYpOworCisJCQkJCQlwcm90ID0gc3dhcDE2IChlaHAtPmV0X3Byb3RsZW4pOworCQkJCQkJdGIgPSBwcm90ICYgMHg4MDAwOworCQkJCQkJbiA9IHByb3QgJiAweDdmZmY7CisKKwkJCQkJCW5ieXRlcyA9IEVMQlRfQlVGU1ogLSBcCisJCQkJCQkJb2Zmc2V0b2YgKEV0aGVybmV0X3QsIFwKKwkJCQkJCQkJZXRfZHNhcCkgLSBcCisJCQkJCQkJRUxCVF9DUkNTWjsKKworCQkJCQkJLyogY2hlY2sgdGhlIGZyYW1lIGlzIGNvcnJlY3QgKi8KKwkJCQkJCWlmIChkYXRsZW4gIT0gRUxCVF9CVUZTWikKKwkJCQkJCQllY3AtPnJ4ZWFjYy5iYWRsZW4rKzsKKwkJCQkJCWVsc2UgaWYgKCFvdXJzKQorCQkJCQkJCWVjcC0+cnhlYWNjLmJhZHNyYysrOworCQkJCQkJZWxzZSBpZiAoIXRiIHx8IG4gPj0gRUxCVF9OVFhCRCkKKwkJCQkJCQllY3AtPnJ4ZWFjYy5iYWR0eXArKzsKKwkJCQkJCWVsc2UgeworCQkJCQkJCXVsb25nIHBhdHdvcmQgPSBcCisJCQkJCQkJCXBhdHdvcmRzW25dOworCQkJCQkJCXVpbnQgbmJiOworCisJCQkJCQkJbmJiID0gYmFkYml0cyAoIFwKKwkJCQkJCQkJJmVocC0+ZXRfZHNhcCwgXAorCQkJCQkJCQluYnl0ZXMsIFwKKwkJCQkJCQkJcGF0d29yZCk7CisKKwkJCQkJCQllY3AtPnJ4ZWFjYy5iYWRiaXQgKz0gXAorCQkJCQkJCQluYmI7CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQlpZiAoZWNwLT5zdGF0ZSA9PSBDbG9zaW5nKQorCQkJCQkgICAgZWNwLT5jbHN0aW1lID0gZ2V0X3RpbWVyICgwKTsKKworCQkJCQkvKiBtYWtlIGl0IGVtcHR5IGFnYWluICovCisJCQkJCWJkcC0+Y2JkX3NjIHw9IEJEX0VORVRfUlhfRU1QVFk7CisJCQkJfQorCisJCQkJaWYgKGVjcC0+c3RhdGUgIT0gQ2xvc2luZykKKwkJCQkJYnJlYWs7CisKKwkJCQkvKgorCQkJCSAqICh3aGlsZSBDbG9zaW5nKSBjaGVjayB0byBzZWUgaWYKKwkJCQkgKiB3YWl0ZWQgbG9uZyBlbm91Z2gKKwkJCQkgKi8KKworCQkJCWlmIChnZXRfdGltZXIgKGVjcC0+Y2xzdGltZSkgPj0gRUxCVF9DTFNXQUlUKSB7CisJCQkJCS8qIHdyaXRlIEdGTVI6IGRpc2FibGUgdHgvcnggKi8KKwkJCQkJZmNwLT5mY2NfZ2ZtciAmPSBcCisJCQkJCQl+KEZDQ19HRk1SX0VOVCB8IEZDQ19HRk1SX0VOUik7CisJCQkJCWVjcC0+c3RhdGUgPSBDbG9zZWQ7CisJCQkJfQorCisJCQkJYnJlYWs7CisKKwkJCWNhc2UgQ2xvc2VkOgorCQkJCW5jbG9zZWQrKzsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJfSB3aGlsZSAobmNsb3NlZCA8IChGQ0NfRU5EX0xPT1AgLSBGQ0NfU1RBUlRfTE9PUCArIDEpKTsKKworCXJ1bnRpbWUgPSBnZXRfdGltZXIgKHJ1bnRpbWUpOworCWlmIChydW50aW1lIDw9IEVMQlRfQ0xTV0FJVCkgeworCQlwcmludGYgKCJXaG9vcHMhIHNvbWVob3cgZWxhcHNlZCB0aW1lICglbGQpIGlzIHdyb25nICg8PSAlZClcbiIsCisJCQlydW50aW1lLCBFTEJUX0NMU1dBSVQpOworCQlyZXR1cm47CisJfQorCW5tc2VjID0gcnVudGltZSAtIEVMQlRfQ0xTV0FJVDsKKworCXByaW50ZiAoIlRlc3QgRmluaXNoZWQgaW4gJWxkbXMgKHBsdXMgJWRtcyBjbG9zZSB3YWl0IHBlcmlvZCkhXG5cbiIsCisJCW5tc2VjLCBFTEJUX0NMU1dBSVQpOworCisJLyoKKwkgKiBub3cgcHJpbnQgc3RhdHMKKwkgKi8KKworCWZvciAoYyA9IEZDQ19TVEFSVF9MT09QOyBjIDw9IEZDQ19FTkRfTE9PUDsgYysrKSB7CisJCWVsYnRfY2hhbiAqZWNwID0gJmVsYnRfY2hhbnNbY107CisJCXVpbnQgcnhwcHMsIHR4cHBzLCBuZXJyOworCisJCXJ4cHBzID0gKGVjcC0+bnJjdmQgKiAxMDAwKSAvIG5tc2VjOworCQl0eHBwcyA9IChlY3AtPm5zZW50ICogMTAwMCkgLyBubXNlYzsKKworCQlwcmludGYgKCJDaGFubmVsICVkOiAlZCByY3ZkICglZCBwcHMsICVkIHJ4ZXJycyksICIKKwkJCSIlZCBzZW50ICglZCBwcHMsICVkIHR4ZXJycylcblxuIiwgYywKKwkJCWVjcC0+bnJjdmQsIHJ4cHBzLCBlY3AtPm5yeGVyciwKKwkJCWVjcC0+bnNlbnQsIHR4cHBzLCBlY3AtPm50eGVycik7CisKKwkJaWYgKChuZXJyID0gZWNwLT5ucnhlcnIpID4gMCkgeworCQkJdWxvbmcgaTsKKworCQkJcHJpbnRmICgiXHRGaXJzdCAlZCByeCBlcnJzOiIsIG5lcnIpOworCQkJZm9yIChpID0gMDsgaSA8IG5lcnI7IGkrKykKKwkJCQlwcmludGYgKCIgJTA0eCIsIGVjcC0+cnhlcnJzW2ldKTsKKwkJCXB1dGMgKCdcbicpOworCQl9CisKKwkJaWYgKChuZXJyID0gZWNwLT5udHhlcnIpID4gMCkgeworCQkJdWxvbmcgaTsKKworCQkJcHJpbnRmICgiXHRGaXJzdCAlZCB0eCBlcnJzOiIsIG5lcnIpOworCQkJZm9yIChpID0gMDsgaSA8IG5lcnI7IGkrKykKKwkJCQlwcmludGYgKCIgJTA0eCIsIGVjcC0+dHhlcnJzW2ldKTsKKwkJCXB1dGMgKCdcbicpOworCQl9CisJfQorCisJcHV0cyAoIlJlY2VpdmUgRXJyb3IgQ291bnRzOlxuIik7CisJZm9yIChjID0gRkNDX1NUQVJUX0xPT1A7IGMgPD0gRkNDX0VORF9MT09QOyBjKyspCisJCWJhc2VzW2NdID0gKHVjaGFyICopJmVsYnRfY2hhbnNbY10ucnhlYWNjOworCXByaW50X2Rlc2MgKHJ4ZWFjY19kZXNjcywgcnhlYWNjX25kZXNjLCBiYXNlcywgMyk7CisKKwlwdXRzICgiXG5UcmFuc21pdCBFcnJvciBDb3VudHM6XG4iKTsKKwlmb3IgKGMgPSBGQ0NfU1RBUlRfTE9PUDsgYyA8PSBGQ0NfRU5EX0xPT1A7IGMrKykKKwkJYmFzZXNbY10gPSAodWNoYXIgKikmZWxidF9jaGFuc1tjXS50eGVhY2M7CisJcHJpbnRfZGVzYyAodHhlYWNjX2Rlc2NzLCB0eGVhY2NfbmRlc2MsIGJhc2VzLCAzKTsKKworCXB1dHMgKCJcblJNT04oLWxpa2UpIENvdW50ZXJzOlxuIik7CisJZm9yIChjID0gRkNDX1NUQVJUX0xPT1A7IGMgPD0gRkNDX0VORF9MT09QOyBjKyspCisJCWJhc2VzW2NdID0gKHVjaGFyICopJmltbXItPmltX2RwcmFtYmFzZVtlbGJ0X2NoYW5zW2NdLnByb2ZmXTsKKwlwcmludF9kZXNjIChlcHJhbV9kZXNjcywgZXByYW1fbmRlc2MsIGJhc2VzLCAzKTsKK30KKworI2VuZGlmIC8qIENPTkZJR19FVEhFUl9MT09QQkFDS19URVNUICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjYwL2V0aGVyX3NjYy5jIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjYwL2V0aGVyX3NjYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMjExMWQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgyNjAvZXRoZXJfc2NjLmMKQEAgLTAsMCArMSwzODcgQEAKKy8qCisgKiBNUEM4MjYwIFNDQyBFdGhlcm5ldAorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMCBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuICAgRGFuIE1hbGVrIChkbWFsZWtAamxjLm5ldCkKKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDAgU3lzZ28gUmVhbC1UaW1lIFNvbHV0aW9ucywgR21iSCA8d3d3LmVsaW5vcy5jb20+CisgKiBNYXJpdXMgR3JvZWdlciA8bWdyb2VnZXJAc3lzZ28uZGU+CisgKgorICogKEMpIENvcHlyaWdodCAoYykgMjAwMQorICogQWR2ZW50IE5ldHdvcmtzLCBJbmMuIDxodHRwOi8vd3d3LmFkdmVudG5ldHdvcmtzLmNvbT4KKyAqIEpheSBNb25rbWFuIDxqdG1Ac21vb3Roc21vb3RoaWUuY29tPgorICoKKyAqIE1vZGlmaWVkIHNvIHRoYXQgaXQgcGxheXMgbmljZWx5IHdoZW4gbW9yZSB0aGFuIG9uZSBFVEhFUk5FVCBpbnRlcmZhY2UKKyAqIGlzIGluIHVzZSBhIGxhIGV0aGVyX2ZjYy5jLgorICogKEMpIENvcHlyaWdodCAyMDA4CisgKiBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW4gR21iSAorICogR2FyeSBKZW5uZWpvaG4gPGdhcnlqQGRlbnguZGU+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGFzbS9jcG1fODI2MC5oPgorI2luY2x1ZGUgPG1wYzgyNjAuaD4KKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpbmNsdWRlIDxuZXQuaD4KKyNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpZm5kZWYgQ09ORklHX05FVF9NVUxUSQorI2Vycm9yICJDT05GSUdfTkVUX01VTFRJIG11c3QgYmUgZGVmaW5lZC4iCisjZW5kaWYKKworI2lmIChDT05GSUdfRVRIRVJfSU5ERVggPT0gMSkKKyMgIGRlZmluZSBQUk9GRl9FTkVUICAgICAgICAgICAgUFJPRkZfU0NDMQorIyAgZGVmaW5lIENQTV9DUl9FTkVUX1BBR0UgICAgICBDUE1fQ1JfU0NDMV9QQUdFCisjICBkZWZpbmUgQ1BNX0NSX0VORVRfU0JMT0NLICAgIENQTV9DUl9TQ0MxX1NCTE9DSworIyAgZGVmaW5lIENNWFNDUl9NQVNLICAgICAgICAgIChDTVhTQ1JfU0MxICAgICAgICAgIHxcCisJCQkJQ01YU0NSX1JTMUNTX01TSyAgICB8XAorCQkJCUNNWFNDUl9UUzFDU19NU0spCisKKyNlbGlmIChDT05GSUdfRVRIRVJfSU5ERVggPT0gMikKKyMgIGRlZmluZSBQUk9GRl9FTkVUICAgICAgICAgICAgUFJPRkZfU0NDMgorIyAgZGVmaW5lIENQTV9DUl9FTkVUX1BBR0UgICAgICBDUE1fQ1JfU0NDMl9QQUdFCisjICBkZWZpbmUgQ1BNX0NSX0VORVRfU0JMT0NLICAgIENQTV9DUl9TQ0MyX1NCTE9DSworIyAgZGVmaW5lIENNWFNDUl9NQVNLICAgICAgICAgIChDTVhTQ1JfU0MyICAgICAgICAgIHxcCisJCQkJQ01YU0NSX1JTMkNTX01TSyAgICB8XAorCQkJCUNNWFNDUl9UUzJDU19NU0spCisKKyNlbGlmIChDT05GSUdfRVRIRVJfSU5ERVggPT0gMykKKyMgIGRlZmluZSBQUk9GRl9FTkVUICAgICAgICAgICAgUFJPRkZfU0NDMworIyAgZGVmaW5lIENQTV9DUl9FTkVUX1BBR0UgICAgICBDUE1fQ1JfU0NDM19QQUdFCisjICBkZWZpbmUgQ1BNX0NSX0VORVRfU0JMT0NLICAgIENQTV9DUl9TQ0MzX1NCTE9DSworIyAgZGVmaW5lIENNWFNDUl9NQVNLICAgICAgICAgIChDTVhTQ1JfU0MzICAgICAgICAgIHxcCisJCQkJQ01YU0NSX1JTM0NTX01TSyAgICB8XAorCQkJCUNNWFNDUl9UUzNDU19NU0spCisjZWxpZiAoQ09ORklHX0VUSEVSX0lOREVYID09IDQpCisjICBkZWZpbmUgUFJPRkZfRU5FVCAgICAgICAgICAgIFBST0ZGX1NDQzQKKyMgIGRlZmluZSBDUE1fQ1JfRU5FVF9QQUdFICAgICAgQ1BNX0NSX1NDQzRfUEFHRQorIyAgZGVmaW5lIENQTV9DUl9FTkVUX1NCTE9DSyAgICBDUE1fQ1JfU0NDNF9TQkxPQ0sKKyMgIGRlZmluZSBDTVhTQ1JfTUFTSyAgICAgICAgICAoQ01YU0NSX1NDNCAgICAgICAgICB8XAorCQkJCUNNWFNDUl9SUzRDU19NU0sgICAgfFwKKwkJCQlDTVhTQ1JfVFM0Q1NfTVNLKQorCisjZW5kaWYKKworCisvKiBFdGhlcm5ldCBUcmFuc21pdCBhbmQgUmVjZWl2ZSBCdWZmZXJzICovCisjZGVmaW5lIERCVUZfTEVOR1RIICAxNTIwCisKKyNkZWZpbmUgVFhfQlVGX0NOVCAyCisKKyNpZiAhZGVmaW5lZChDT05GSUdfU1lTX1NDQ19UT1VUX0xPT1ApCisgICNkZWZpbmUgQ09ORklHX1NZU19TQ0NfVE9VVF9MT09QIDEwMDAwMDAKKyNlbmRpZgorCitzdGF0aWMgY2hhciB0eGJ1ZltUWF9CVUZfQ05UXVsgREJVRl9MRU5HVEggXTsKKworc3RhdGljIHVpbnQgcnhJZHg7ICAgICAgLyogaW5kZXggb2YgdGhlIGN1cnJlbnQgUlggYnVmZmVyICovCitzdGF0aWMgdWludCB0eElkeDsgICAgICAvKiBpbmRleCBvZiB0aGUgY3VycmVudCBUWCBidWZmZXIgKi8KKworLyoKKyAqIFNDQyBFdGhlcm5ldCBUeCBhbmQgUnggYnVmZmVyIGRlc2NyaXB0b3JzIGFsbG9jYXRlZCBhdCB0aGUKKyAqICBpbW1yLT51ZGF0YV9iZCBhZGRyZXNzIG9uIER1YWwtUG9ydCBSQU0KKyAqIFByb3ZpZGUgZm9yIERvdWJsZSBCdWZmZXJpbmcKKyAqLworCit0eXBlZGVmIHZvbGF0aWxlIHN0cnVjdCBDb21tb25CdWZmZXJEZXNjcmlwdG9yIHsKKyAgICBjYmRfdCByeGJkW1BLVEJVRlNSWF07ICAgICAgICAgLyogUnggQkQgKi8KKyAgICBjYmRfdCB0eGJkW1RYX0JVRl9DTlRdOyAgICAgICAgLyogVHggQkQgKi8KK30gUlRYQkQ7CisKK3N0YXRpYyBSVFhCRCAqcnR4OworCisKK3N0YXRpYyBpbnQgc2VjX3NlbmQoc3RydWN0IGV0aF9kZXZpY2UgKmRldiwgdm9sYXRpbGUgdm9pZCAqcGFja2V0LCBpbnQgbGVuZ3RoKQoreworICAgIGludCBpOworICAgIGludCByZXN1bHQgPSAwOworCisgICAgaWYgKGxlbmd0aCA8PSAwKSB7CisJcHJpbnRmKCJzY2M6IGJhZCBwYWNrZXQgc2l6ZTogJWRcbiIsIGxlbmd0aCk7CisJZ290byBvdXQ7CisgICAgfQorCisgICAgZm9yKGk9MDsgcnR4LT50eGJkW3R4SWR4XS5jYmRfc2MgJiBCRF9FTkVUX1RYX1JFQURZOyBpKyspIHsKKwlpZiAoaSA+PSBDT05GSUdfU1lTX1NDQ19UT1VUX0xPT1ApIHsKKwkgICAgcHV0cyAoInNjYzogdHggYnVmZmVyIG5vdCByZWFkeVxuIik7CisJICAgIGdvdG8gb3V0OworCX0KKyAgICB9CisKKyAgICBydHgtPnR4YmRbdHhJZHhdLmNiZF9idWZhZGRyID0gKHVpbnQpcGFja2V0OworICAgIHJ0eC0+dHhiZFt0eElkeF0uY2JkX2RhdGxlbiA9IGxlbmd0aDsKKyAgICBydHgtPnR4YmRbdHhJZHhdLmNiZF9zYyB8PSAoQkRfRU5FVF9UWF9SRUFEWSB8IEJEX0VORVRfVFhfTEFTVCB8CisJCQkJQkRfRU5FVF9UWF9XUkFQKTsKKworICAgIGZvcihpPTA7IHJ0eC0+dHhiZFt0eElkeF0uY2JkX3NjICYgQkRfRU5FVF9UWF9SRUFEWTsgaSsrKSB7CisJaWYgKGkgPj0gQ09ORklHX1NZU19TQ0NfVE9VVF9MT09QKSB7CisJICAgIHB1dHMgKCJzY2M6IHR4IGVycm9yXG4iKTsKKwkgICAgZ290byBvdXQ7CisJfQorICAgIH0KKworICAgIC8qIHJldHVybiBvbmx5IHN0YXR1cyBiaXRzICovCisgICAgcmVzdWx0ID0gcnR4LT50eGJkW3R4SWR4XS5jYmRfc2MgJiBCRF9FTkVUX1RYX1NUQVRTOworCisgb3V0OgorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworc3RhdGljIGludCBzZWNfcngoc3RydWN0IGV0aF9kZXZpY2UgKmRldikKK3sKKyAgICBpbnQgbGVuZ3RoOworCisgICAgZm9yICg7OykKKyAgICB7CisJaWYgKHJ0eC0+cnhiZFtyeElkeF0uY2JkX3NjICYgQkRfRU5FVF9SWF9FTVBUWSkgeworCSAgICBsZW5ndGggPSAtMTsKKwkgICAgYnJlYWs7ICAgICAvKiBub3RoaW5nIHJlY2VpdmVkIC0gbGVhdmUgZm9yKCkgbG9vcCAqLworCX0KKworCWxlbmd0aCA9IHJ0eC0+cnhiZFtyeElkeF0uY2JkX2RhdGxlbjsKKworCWlmIChydHgtPnJ4YmRbcnhJZHhdLmNiZF9zYyAmIDB4MDAzZikKKwl7CisJICAgIHByaW50ZigiZXJyOiAleFxuIiwgcnR4LT5yeGJkW3J4SWR4XS5jYmRfc2MpOworCX0KKwllbHNlCisJeworCSAgICAvKiBQYXNzIHRoZSBwYWNrZXQgdXAgdG8gdGhlIHByb3RvY29sIGxheWVycy4gKi8KKwkgICAgTmV0UmVjZWl2ZShOZXRSeFBhY2tldHNbcnhJZHhdLCBsZW5ndGggLSA0KTsKKwl9CisKKworCS8qIEdpdmUgdGhlIGJ1ZmZlciBiYWNrIHRvIHRoZSBTQ0MuICovCisJcnR4LT5yeGJkW3J4SWR4XS5jYmRfZGF0bGVuID0gMDsKKworCS8qIHdyYXAgYXJvdW5kIGJ1ZmZlciBpbmRleCB3aGVuIG5lY2Vzc2FyeSAqLworCWlmICgocnhJZHggKyAxKSA+PSBQS1RCVUZTUlgpIHsKKwkgICAgcnR4LT5yeGJkW1BLVEJVRlNSWCAtIDFdLmNiZF9zYyA9IChCRF9FTkVUX1JYX1dSQVAgfAorCQkJCQkgICAgICAgQkRfRU5FVF9SWF9FTVBUWSk7CisJICAgIHJ4SWR4ID0gMDsKKwl9CisJZWxzZSB7CisJICAgIHJ0eC0+cnhiZFtyeElkeF0uY2JkX3NjID0gQkRfRU5FVF9SWF9FTVBUWTsKKwkgICAgcnhJZHgrKzsKKwl9CisgICAgfQorICAgIHJldHVybiBsZW5ndGg7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFNDQyBFdGhlcm5ldCBJbml0aWFsaXphdGlvbiBSb3V0aW5lCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgc2VjX2luaXQoc3RydWN0IGV0aF9kZXZpY2UgKmRldiwgYmRfdCAqYmlzKQoreworICAgIGludCBpOworICAgIHZvbGF0aWxlIGltbWFwX3QgKmltbXIgPSAoaW1tYXBfdCAqKUNPTkZJR19TWVNfSU1NUjsKKyAgICBzY2NfZW5ldF90ICpwcmFtX3B0cjsKKyAgICB1aW50IGRwYWRkcjsKKyAgICB1Y2hhciBlYVs2XTsKKworICAgIHJ4SWR4ID0gMDsKKyAgICB0eElkeCA9IDA7CisKKyAgICAvKgorICAgICAqIEFzc2lnbiBzdGF0aWMgcG9pbnRlciB0byBCRCBhcmVhLgorICAgICAqIEF2b2lkIGV4aGF1c3RpbmcgRFBSQU0sIHdoaWNoIHdvdWxkIGNhdXNlIGEgcGFuaWMuCisgICAgICovCisgICAgaWYgKHJ0eCA9PSBOVUxMKSB7CisJICAgIGRwYWRkciA9IG04MjYwX2NwbV9kcGFsbG9jKHNpemVvZihSVFhCRCkgKyAyLCAxNik7CisJICAgIHJ0eCA9IChSVFhCRCAqKSZpbW1yLT5pbV9kcHJhbWJhc2VbZHBhZGRyXTsKKyAgICB9CisKKyAgICAvKiAyNC4yMSAtICgxLTMpOiBpb3BvcnRzIGhhdmUgYmVlbiBzZXQgdXAgYWxyZWFkeSAqLworCisgICAgLyogMjQuMjEgLSAoNCw1KTogY29ubmVjdCBTQ0MncyB0eCBhbmQgcnggY2xvY2tzLCB1c2UgTk1TSSBmb3IgU0NDICovCisgICAgaW1tci0+aW1fY3BtdXguY214X3VhciA9IDA7CisgICAgaW1tci0+aW1fY3BtdXguY214X3NjciA9ICggKGltbXItPmltX2NwbXV4LmNteF9zY3IgJiB+Q01YU0NSX01BU0spIHwKKwkJCSAgICAgICBDT05GSUdfU1lTX0NNWFNDUl9WQUxVRSk7CisKKworICAgIC8qIDI0LjIxICg2KSB3cml0ZSBSQkFTRSBhbmQgVEJBU0UgdG8gcGFyYW1ldGVyIFJBTSAqLworICAgIHByYW1fcHRyID0gKHNjY19lbmV0X3QgKikmKGltbXItPmltX2RwcmFtYmFzZVtQUk9GRl9FTkVUXSk7CisgICAgcHJhbV9wdHItPnNlbl9nZW5zY2Muc2NjX3JiYXNlID0gKHVuc2lnbmVkIGludCkoJnJ0eC0+cnhiZFswXSk7CisgICAgcHJhbV9wdHItPnNlbl9nZW5zY2Muc2NjX3RiYXNlID0gKHVuc2lnbmVkIGludCkoJnJ0eC0+dHhiZFswXSk7CisKKyAgICBwcmFtX3B0ci0+c2VuX2dlbnNjYy5zY2NfcmZjciA9IDB4MTg7ICAvKiBOcm1sIE9wcyBhbmQgTW90IGJ5dGUgb3JkZXJpbmcgKi8KKyAgICBwcmFtX3B0ci0+c2VuX2dlbnNjYy5zY2NfdGZjciA9IDB4MTg7ICAvKiBNb3QgYnl0ZSBvcmRlcmluZywgTnJtbCBhY2Nlc3MgKi8KKworICAgIHByYW1fcHRyLT5zZW5fZ2Vuc2NjLnNjY19tcmJsciA9IERCVUZfTEVOR1RIOyAvKiBtYXguIHBhY2thZ2UgbGVuIDE1MjAgKi8KKworICAgIHByYW1fcHRyLT5zZW5fY3ByZXMgID0gfigweDApOyAgICAgICAgLyogUHJlc2V0IENSQyAqLworICAgIHByYW1fcHRyLT5zZW5fY21hc2sgID0gMHhkZWJiMjBlMzsgICAgLyogQ29uc3RhbnQgTWFzayBmb3IgQ1JDICovCisKKworICAgIC8qIDI0LjIxIC0gKDcpOiBXcml0ZSBJTklUIFJYIEFORCBUWCBQQVJBTUVURVJTIHRvIENQQ1IgKi8KKyAgICB3aGlsZShpbW1yLT5pbV9jcG0uY3BfY3BjciAmIENQTV9DUl9GTEcpOworICAgIGltbXItPmltX2NwbS5jcF9jcGNyID0gbWtfY3JfY21kKENQTV9DUl9FTkVUX1BBR0UsCisJCQkJICAgICBDUE1fQ1JfRU5FVF9TQkxPQ0ssCisJCQkJICAgICAweDBjLAorCQkJCSAgICAgQ1BNX0NSX0lOSVRfVFJYKSB8IENQTV9DUl9GTEc7CisKKyAgICAvKiAyNC4yMSAtICg4LTE4KTogU2V0IHVwIHBhcmFtZXRlciBSQU0gKi8KKyAgICBwcmFtX3B0ci0+c2VuX2NyY2VjICA9IDB4MDsgICAgICAgICAgIC8qIEVycm9yIENvdW50ZXIgQ1JDICh1bnVzZWQpICovCisgICAgcHJhbV9wdHItPnNlbl9hbGVjICAgPSAweDA7ICAgICAgICAgICAvKiBBbGlnbiBFcnJvciBDb3VudGVyICh1bnVzZWQpICovCisgICAgcHJhbV9wdHItPnNlbl9kaXNmYyAgPSAweDA7ICAgICAgICAgICAvKiBEaXNjYXJkIEZyYW1lIENvdW50ZXIgKHVudXNlZCkgKi8KKworICAgIHByYW1fcHRyLT5zZW5fcGFkcyAgID0gMHg4ODg4OyAgICAgICAgLyogU2hvcnQgRnJhbWUgUEFEIENoYXJhY3RlcnMgKi8KKworICAgIHByYW1fcHRyLT5zZW5fcmV0bGltID0gMTU7ICAgICAgICAgICAgLyogUmV0cnkgTGltaXQgVGhyZXNob2xkICovCisKKyAgICBwcmFtX3B0ci0+c2VuX21heGZsciA9IDE1MTg7ICAvKiBNQVggRnJhbWUgTGVuZ3RoIFJlZ2lzdGVyICovCisgICAgcHJhbV9wdHItPnNlbl9taW5mbHIgPSA2NDsgICAgICAgICAgICAvKiBNSU4gRnJhbWUgTGVuZ3RoIFJlZ2lzdGVyICovCisKKyAgICBwcmFtX3B0ci0+c2VuX21heGQxICA9IERCVUZfTEVOR1RIOyAgIC8qIE1BWCBETUExIExlbmd0aCBSZWdpc3RlciAqLworICAgIHByYW1fcHRyLT5zZW5fbWF4ZDIgID0gREJVRl9MRU5HVEg7ICAgLyogTUFYIERNQTIgTGVuZ3RoIFJlZ2lzdGVyICovCisKKyAgICBwcmFtX3B0ci0+c2VuX2dhZGRyMSA9IDB4MDsgICAvKiBHcm91cCBBZGRyZXNzIEZpbHRlciAxICh1bnVzZWQpICovCisgICAgcHJhbV9wdHItPnNlbl9nYWRkcjIgPSAweDA7ICAgLyogR3JvdXAgQWRkcmVzcyBGaWx0ZXIgMiAodW51c2VkKSAqLworICAgIHByYW1fcHRyLT5zZW5fZ2FkZHIzID0gMHgwOyAgIC8qIEdyb3VwIEFkZHJlc3MgRmlsdGVyIDMgKHVudXNlZCkgKi8KKyAgICBwcmFtX3B0ci0+c2VuX2dhZGRyNCA9IDB4MDsgICAvKiBHcm91cCBBZGRyZXNzIEZpbHRlciA0ICh1bnVzZWQpICovCisKKyAgICBldGhfZ2V0ZW52X2VuZXRhZGRyKCJldGhhZGRyIiwgZWEpOworICAgIHByYW1fcHRyLT5zZW5fcGFkZHJoID0gKGVhWzVdIDw8IDgpICsgZWFbNF07CisgICAgcHJhbV9wdHItPnNlbl9wYWRkcm0gPSAoZWFbM10gPDwgOCkgKyBlYVsyXTsKKyAgICBwcmFtX3B0ci0+c2VuX3BhZGRybCA9IChlYVsxXSA8PCA4KSArIGVhWzBdOworCisgICAgcHJhbV9wdHItPnNlbl9wcGVyICAgPSAweDA7ICAgLyogUGVyc2lzdGVuY2UgKHVudXNlZCkgKi8KKworICAgIHByYW1fcHRyLT5zZW5faWFkZHIxID0gMHgwOyAgIC8qIEluZGl2aWR1YWwgQWRkcmVzcyBGaWx0ZXIgMSAodW51c2VkKSAqLworICAgIHByYW1fcHRyLT5zZW5faWFkZHIyID0gMHgwOyAgIC8qIEluZGl2aWR1YWwgQWRkcmVzcyBGaWx0ZXIgMiAodW51c2VkKSAqLworICAgIHByYW1fcHRyLT5zZW5faWFkZHIzID0gMHgwOyAgIC8qIEluZGl2aWR1YWwgQWRkcmVzcyBGaWx0ZXIgMyAodW51c2VkKSAqLworICAgIHByYW1fcHRyLT5zZW5faWFkZHI0ID0gMHgwOyAgIC8qIEluZGl2aWR1YWwgQWRkcmVzcyBGaWx0ZXIgNCAodW51c2VkKSAqLworCisgICAgcHJhbV9wdHItPnNlbl90YWRkcmggPSAweDA7ICAgLyogVG1wIEFkZHJlc3MgKE1TQikgKHVudXNlZCkgKi8KKyAgICBwcmFtX3B0ci0+c2VuX3RhZGRybSA9IDB4MDsgICAvKiBUbXAgQWRkcmVzcyAodW51c2VkKSAqLworICAgIHByYW1fcHRyLT5zZW5fdGFkZHJsID0gMHgwOyAgIC8qIFRtcCBBZGRyZXNzIChMU0IpICh1bnVzZWQpICovCisKKyAgICAvKiAyNC4yMSAtICgxOSk6IEluaXRpYWxpemUgUnhCRCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBQS1RCVUZTUlg7IGkrKykKKyAgICB7CisJcnR4LT5yeGJkW2ldLmNiZF9zYyA9IEJEX0VORVRfUlhfRU1QVFk7CisJcnR4LT5yeGJkW2ldLmNiZF9kYXRsZW4gPSAwOyAgICAgICAgICAgICAgICAgIC8qIFJlc2V0ICovCisJcnR4LT5yeGJkW2ldLmNiZF9idWZhZGRyID0gKHVpbnQpTmV0UnhQYWNrZXRzW2ldOworICAgIH0KKworICAgIHJ0eC0+cnhiZFtQS1RCVUZTUlggLSAxXS5jYmRfc2MgfD0gQkRfRU5FVF9SWF9XUkFQOworCisgICAgLyogMjQuMjEgLSAoMjApOiBJbml0aWFsaXplIFR4QkQgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgVFhfQlVGX0NOVDsgaSsrKQorICAgIHsKKwlydHgtPnR4YmRbaV0uY2JkX3NjID0gKEJEX0VORVRfVFhfUEFEICB8CisJCQkgICAgICAgQkRfRU5FVF9UWF9MQVNUIHwKKwkJCSAgICAgICBCRF9FTkVUX1RYX1RDKTsKKwlydHgtPnR4YmRbaV0uY2JkX2RhdGxlbiA9IDA7ICAgICAgICAgICAgICAgICAgLyogUmVzZXQgKi8KKwlydHgtPnR4YmRbaV0uY2JkX2J1ZmFkZHIgPSAodWludCkmdHhidWZbaV1bMF07CisgICAgfQorCisgICAgcnR4LT50eGJkW1RYX0JVRl9DTlQgLSAxXS5jYmRfc2MgfD0gQkRfRU5FVF9UWF9XUkFQOworCisgICAgLyogMjQuMjEgLSAoMjEpOiBXcml0ZSAweGZmZmYgdG8gU0NDRSAqLworICAgIGltbXItPmltX3NjY1tDT05GSUdfRVRIRVJfSU5ERVgtMV0uc2NjX3NjY2UgPSB+KDB4MCk7CisKKyAgICAvKiAyNC4yMSAtICgyMik6IFdyaXRlIHRvIFNDQ00gdG8gZW5hYmxlIFRYRSwgUlhGLCBUWEIgZXZlbnRzICovCisgICAgaW1tci0+aW1fc2NjW0NPTkZJR19FVEhFUl9JTkRFWC0xXS5zY2Nfc2NjbSA9IChTQ0NFX0VORVRfVFhFIHwKKwkJCQkJCSAgIFNDQ0VfRU5FVF9SWEYgfAorCQkJCQkJICAgU0NDRV9FTkVUX1RYQik7CisKKyAgICAvKiAyNC4yMSAtICgyMyk6IHdlIGRvbid0IHVzZSBldGhlcm5ldCBpbnRlcnJ1cHRzICovCisKKyAgICAvKiAyNC4yMSAtICgyNCk6IENsZWFyIEdTTVJfSCB0byBlbmFibGUgbm9ybWFsIG9wZXJhdGlvbnMgKi8KKyAgICBpbW1yLT5pbV9zY2NbQ09ORklHX0VUSEVSX0lOREVYLTFdLnNjY19nc21yaCA9IDA7CisKKyAgICAvKiAyNC4yMSAtICgyNSk6IENsZWFyIEdTTVJfTCB0byBlbmFibGUgbm9ybWFsIG9wZXJhdGlvbnMgKi8KKyAgICBpbW1yLT5pbV9zY2NbQ09ORklHX0VUSEVSX0lOREVYLTFdLnNjY19nc21ybCA9IChTQ0NfR1NNUkxfVENJICAgICAgICB8CisJCQkJCQkgICAgU0NDX0dTTVJMX1RQTF80OCAgICAgfAorCQkJCQkJICAgIFNDQ19HU01STF9UUFBfMTAgICAgIHwKKwkJCQkJCSAgICBTQ0NfR1NNUkxfTU9ERV9FTkVUKTsKKworICAgIC8qIDI0LjIxIC0gKDI2KTogSW5pdGlhbGl6ZSBEU1IgKi8KKyAgICBpbW1yLT5pbV9zY2NbQ09ORklHX0VUSEVSX0lOREVYLTFdLnNjY19kc3IgPSAweGQ1NTU7CisKKyAgICAvKiAyNC4yMSAtICgyNyk6IEluaXRpYWxpemUgUFNNUjIKKyAgICAgKgorICAgICAqIFNldHRpbmdzOgorICAgICAqCUNSQyA9IDMyLUJpdCBDQ0lUVAorICAgICAqCU5JQiA9IEJlZ2luIHNlYXJjaGluZyBmb3IgU0ZEIDIyIGJpdHMgYWZ0ZXIgUkVOQQorICAgICAqCUZERSA9IEZ1bGwgRHVwbGV4IEVuYWJsZQorICAgICAqCUJSTyA9IFJlamVjdCBicm9hZGNhc3QgcGFja2V0cworICAgICAqCVBST01JU0NPVVMgPSBDYXRjaCBhbGwgcGFja2V0cyByZWdhcmRsZXNzIG9mIGRlc3QuIE1BQyBhZHJlc3MKKyAgICAgKi8KKyAgICBpbW1yLT5pbV9zY2NbQ09ORklHX0VUSEVSX0lOREVYLTFdLnNjY19wc21yICAgPQlTQ0NfUFNNUl9FTkNSQwl8CisJCQkJCQkJU0NDX1BTTVJfTklCMjIJfAorI2lmIGRlZmluZWQoQ09ORklHX1NDQ19FTkVUX0ZVTExfRFVQTEVYKQorCQkJCQkJCVNDQ19QU01SX0ZERQl8CisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19TQ0NfRU5FVF9OT19CUk9BRENBU1QpCisJCQkJCQkJU0NDX1BTTVJfQlJPCXwKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX1NDQ19FTkVUX1BST01JU0NPVVMpCisJCQkJCQkJU0NDX1BTTVJfUFJPCXwKKyNlbmRpZgorCQkJCQkJCTA7CisKKyAgICAvKiAyNC4yMSAtICgyOCk6IFdyaXRlIHRvIEdTTVJfTCB0byBlbmFibGUgU0NDICovCisgICAgaW1tci0+aW1fc2NjW0NPTkZJR19FVEhFUl9JTkRFWC0xXS5zY2NfZ3NtcmwgfD0gKFNDQ19HU01STF9FTlIgfAorCQkJCQkJICAgICBTQ0NfR1NNUkxfRU5UKTsKKworICAgIHJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIHNlY19oYWx0KHN0cnVjdCBldGhfZGV2aWNlICpkZXYpCit7CisgICAgdm9sYXRpbGUgaW1tYXBfdCAqaW1tciA9IChpbW1hcF90ICopQ09ORklHX1NZU19JTU1SOworICAgIGltbXItPmltX3NjY1tDT05GSUdfRVRIRVJfSU5ERVgtMV0uc2NjX2dzbXJsICY9IH4oU0NDX0dTTVJMX0VOUiB8CisJCQkJCQkgICAgICBTQ0NfR1NNUkxfRU5UKTsKK30KKworI2lmIDAKK3N0YXRpYyB2b2lkIHNlY19yZXN0YXJ0KHZvaWQpCit7CisgICAgdm9sYXRpbGUgaW1tYXBfdCAqaW1tciA9IChpbW1hcF90ICopQ09ORklHX1NZU19JTU1SOworICAgIGltbXItPmltX2NwbS5jcF9zY2NbQ09ORklHX0VUSEVSX0lOREVYLTFdLnNjY19nc21ybCB8PSAoU0NDX0dTTVJMX0VOUiB8CisJCQkJCQkJICAgIFNDQ19HU01STF9FTlQpOworfQorI2VuZGlmCisKK2ludCBtcGM4Mnh4X3NjY19lbmV0X2luaXRpYWxpemUoYmRfdCAqYmlzKQoreworCXN0cnVjdCBldGhfZGV2aWNlICpkZXY7CisKKwlkZXYgPSAoc3RydWN0IGV0aF9kZXZpY2UgKikgbWFsbG9jKHNpemVvZiAqZGV2KTsKKwltZW1zZXQoZGV2LCAwLCBzaXplb2YgKmRldik7CisKKwlzcHJpbnRmKGRldi0+bmFtZSwgIlNDQyBFVEhFUk5FVCIpOworCWRldi0+aW5pdCAgID0gc2VjX2luaXQ7CisJZGV2LT5oYWx0ICAgPSBzZWNfaGFsdDsKKwlkZXYtPnNlbmQgICA9IHNlY19zZW5kOworCWRldi0+cmVjdiAgID0gc2VjX3J4OworCisJZXRoX3JlZ2lzdGVyKGRldik7CisKKwlyZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI2MC9pMmMuYyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI2MC9pMmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmJkY2MyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjYwL2kyYy5jCkBAIC0wLDAgKzEsNzg1IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAwCisgKiBQYW9sbyBTY2FmZmFyZGksIEFJUlZFTlQgU0FNIHMucC5hIC0gUklNSU5JKElUQUxZKSwgYXJzZW5pb0B0aW4uaXQKKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDAgU3lzZ28gUmVhbC1UaW1lIFNvbHV0aW9ucywgR21iSCA8d3d3LmVsaW5vcy5jb20+CisgKiBNYXJpdXMgR3JvZWdlciA8bWdyb2VnZXJAc3lzZ28uZGU+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfSEFSRF9JMkMpCisKKyNpbmNsdWRlIDxhc20vY3BtXzgyNjAuaD4KKyNpbmNsdWRlIDxpMmMuaD4KKworLyogZGVmaW5lIHRvIGVuYWJsZSBkZWJ1ZyBtZXNzYWdlcyAqLworI3VuZGVmICBERUJVR19JMkMKKworREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKyNpZiBkZWZpbmVkKENPTkZJR19JMkNfTVVMVElfQlVTKQorc3RhdGljIHVuc2lnbmVkIGludCBpMmNfYnVzX251bSBfX2F0dHJpYnV0ZV9fICgoc2VjdGlvbiAoIi5kYXRhIikpKSA9IDA7CisjZW5kaWYgLyogQ09ORklHX0kyQ19NVUxUSV9CVVMgKi8KKworLyogdVNlYyB0byB3YWl0IGJldHdlZW4gcG9sbHMgb2YgdGhlIGkyYyAqLworI2RlZmluZSBERUxBWV9VUwkxMDAKKy8qIHVTZWMgdG8gd2FpdCBmb3IgdGhlIENQTSB0byBzdGFydCBwcm9jZXNzaW5nIHRoZSBidWZmZXIgKi8KKyNkZWZpbmUgU1RBUlRfREVMQVlfVVMJMTAwMAorCisvKgorICogdHgvcnggcGVyLWJ5dGUgdGltZW91dDogd2UgZGVsYXkgREVMQVlfVVMgdVNlYyBiZXR3ZWVuIHBvbGxzIHNvIHRoZQorICogdGltZW91dCB3aWxsIGJlICh0eF9sZW5ndGggKyByeF9sZW5ndGgpICogREVMQVlfVVMgKiBUT1VUX0xPT1AKKyAqLworI2RlZmluZSBUT1VUX0xPT1AgNQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTZXQgZGVmYXVsdCB2YWx1ZXMKKyAqLworI2lmbmRlZglDT05GSUdfU1lTX0kyQ19TUEVFRAorI2RlZmluZQlDT05GSUdfU1lTX0kyQ19TUEVFRAk1MDAwMAorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCit0eXBlZGVmIHZvaWQgKCppMmNfZWNiX3QpKGludCwgaW50LCB2b2lkICopOyAgICAvKiBlcnJvciBjYWxsYmFjayBmdW5jdGlvbiAqLworCisvKiBUaGlzIHN0cnVjdHVyZSBrZWVwcyB0cmFjayBvZiB0aGUgYmQgYW5kIGJ1ZmZlciBzcGFjZSB1c2FnZS4gKi8KK3R5cGVkZWYgc3RydWN0IGkyY19zdGF0ZSB7CisJaW50CQlyeF9pZHg7CQkvKiBpbmRleCAgIHRvIG5leHQgZnJlZSBSeCBCRCAqLworCWludAkJdHhfaWR4OwkJLyogaW5kZXggICB0byBuZXh0IGZyZWUgVHggQkQgKi8KKwl2b2lkCQkqcnhiZDsJCS8qIHBvaW50ZXIgdG8gbmV4dCBmcmVlIFJ4IEJEICovCisJdm9pZAkJKnR4YmQ7CQkvKiBwb2ludGVyIHRvIG5leHQgZnJlZSBUeCBCRCAqLworCWludAkJdHhfc3BhY2U7CS8qIG51bWJlciAgb2YgVHggYnl0ZXMgbGVmdCAgICovCisJdW5zaWduZWQgY2hhcgkqdHhfYnVmOwkvKiBwb2ludGVyIHRvIGZyZWUgVHggYXJlYSAgICAqLworCWkyY19lY2JfdAllcnJfY2I7CQkvKiBlcnJvciBjYWxsYmFjayBmdW5jdGlvbiAgICAqLworCXZvaWQJCSpjYl9kYXRhOwkvKiBwcml2YXRlIGRhdGEgdG8gYmUgcGFzc2VkICAqLworfSBpMmNfc3RhdGVfdDsKKworLyogZmxhZ3MgZm9yIGkyY19zZW5kKCkgYW5kIGkyY19yZWNlaXZlKCkgKi8KKyNkZWZpbmUJSTJDRl9FTkFCTEVfU0VDT05EQVJZCTB4MDEJLyogc2Vjb25kYXJ5X2FkZHJlc3MgaXMgdmFsaWQJKi8KKyNkZWZpbmUJSTJDRl9TVEFSVF9DT05ECQkweDAyCS8qIHR4OiBnZW5lcmF0ZSBzdGFydCBjb25kaXRpb24JKi8KKyNkZWZpbmUgSTJDRl9TVE9QX0NPTkQJCTB4MDQJLyogdHg6IGdlbmVyYXRlIHN0b3AgIGNvbmRpdGlvbgkqLworCisvKiByZXR1cm4gY29kZXMgKi8KKyNkZWZpbmUgSTJDRVJSX05PX0JVRkZFUlMJMQkvKiBubyBtb3JlIEJEcyBvciBidWZmZXIgc3BhY2UJKi8KKyNkZWZpbmUgSTJDRVJSX01TR19UT09fTE9ORwkyCS8qIHRyaWVkIHRvIHNlbmQvcmVjZWl2ZSB0byBtdWNoIGRhdGEgICAqLworI2RlZmluZSBJMkNFUlJfVElNRU9VVAkJMwkvKiB0aW1lb3V0IGluIGkyY19kb2lvKCkJKi8KKyNkZWZpbmUgSTJDRVJSX1FVRVVFX0VNUFRZCTQJLyogaTJjX2RvaW8gY2FsbGVkIHdpdGhvdXQgc2VuZC9yZWNlaXZlICovCisjZGVmaW5lIEkyQ0VSUl9JT19FUlJPUgkJNQkvKiBoYWQgYW4gZXJyb3IgZHVyaW5nIGNvbW1zCSovCisKKy8qIGVycm9yIGNhbGxiYWNrIGZsYWdzICovCisjZGVmaW5lIEkyQ0VDQl9SWF9FUlIJCTB4MTAJLyogdGhpcyBpcyBhIHJlY2VpdmUgZXJyb3IJKi8KKyNkZWZpbmUgICAgIEkyQ0VDQl9SWF9PVgkweDAyCS8qIHJlY2VpdmUgb3ZlcnJ1biBlcnJvcgkqLworI2RlZmluZSAgICAgSTJDRUNCX1JYX01BU0sJMHgwZgkvKiBtYXNrIGZvciBlcnJvciBiaXRzCQkqLworI2RlZmluZSBJMkNFQ0JfVFhfRVJSCQkweDIwCS8qIHRoaXMgaXMgYSB0cmFuc21pdCBlcnJvcgkqLworI2RlZmluZSAgICAgSTJDRUNCX1RYX0NMCTB4MDEJLyogdHJhbnNtaXQgY29sbGlzaW9uIGVycm9yCSovCisjZGVmaW5lICAgICBJMkNFQ0JfVFhfVU4JMHgwMgkvKiB0cmFuc21pdCB1bmRlcmZsb3cgZXJyb3IJKi8KKyNkZWZpbmUgICAgIEkyQ0VDQl9UWF9OQUsJMHgwNAkvKiB0cmFuc21pdCBubyBhY2sgZXJyb3IJKi8KKyNkZWZpbmUgICAgIEkyQ0VDQl9UWF9NQVNLCTB4MGYJLyogbWFzayBmb3IgZXJyb3IgYml0cwkJKi8KKyNkZWZpbmUgSTJDRUNCX1RJTUVPVVQJCTB4NDAJLyogdGhpcyBpcyBhIHRpbWVvdXQgZXJyb3IJKi8KKworI2RlZmluZSBFUlJPUl9JMkNfTk9ORQkJMAorI2RlZmluZSBFUlJPUl9JMkNfTEVOR1RICTEKKworI2RlZmluZSBJMkNfV1JJVEVfQklUCQkweDAwCisjZGVmaW5lIEkyQ19SRUFEX0JJVAkJMHgwMQorCisjZGVmaW5lIEkyQ19SWFRYX0xFTgkxMjgJLyogbWF4aW11bSB0eC9yeCBidWZmZXIgbGVuZ3RoICovCisKKworI2RlZmluZSBOVU1fUlhfQkRTIDQKKyNkZWZpbmUgTlVNX1RYX0JEUyA0CisjZGVmaW5lIE1BWF9UWF9TUEFDRSAyNTYKKwordHlwZWRlZiBzdHJ1Y3QgSTJDX0JECit7CisgIHVuc2lnbmVkIHNob3J0IHN0YXR1czsKKyAgdW5zaWduZWQgc2hvcnQgbGVuZ3RoOworICB1bnNpZ25lZCBjaGFyICphZGRyOworfSBJMkNfQkQ7CisjZGVmaW5lIEJEX0kyQ19UWF9TVEFSVCAweDA0MDAgIC8qIHNwZWNpYWwgc3RhdHVzIGZvciBpMmM6IFN0YXJ0IGNvbmRpdGlvbiAqLworCisjZGVmaW5lIEJEX0kyQ19UWF9DTAkweDAwMDEJLyogY29sbGlzaW9uIGVycm9yICovCisjZGVmaW5lIEJEX0kyQ19UWF9VTgkweDAwMDIJLyogdW5kZXJmbG93IGVycm9yICovCisjZGVmaW5lIEJEX0kyQ19UWF9OQUsJMHgwMDA0CS8qIG5vIGFja25vd2xlZGdlIGVycm9yICovCisjZGVmaW5lIEJEX0kyQ19UWF9FUlIJKEJEX0kyQ19UWF9OQUt8QkRfSTJDX1RYX1VOfEJEX0kyQ19UWF9DTCkKKworI2RlZmluZSBCRF9JMkNfUlhfRVJSCUJEX1NDX09WCisKKyNpZmRlZiBERUJVR19JMkMKKyNkZWZpbmUgUFJJTlREKHgpIHByaW50ZiB4CisjZWxzZQorI2RlZmluZSBQUklOVEQoeCkKKyNlbmRpZgorCisvKgorICogUmV0dXJucyB0aGUgYmVzdCB2YWx1ZSBvZiBJMkJSRyB0byBtZWV0IGRlc2lyZWQgY2xvY2sgc3BlZWQgb2YgSTJDIHdpdGgKKyAqIGlucHV0IHBhcmFtZXRlcnMgKGNsb2NrIHNwZWVkLCBmaWx0ZXIsIGFuZCBwcmVkaXZpZGVyIHZhbHVlKS4KKyAqIEl0IHJldHVybnMgY29tcHV0ZXIgc3BlZWQgdmFsdWUgYW5kIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gaXQgYW5kIGRlc2lyZWQKKyAqIHNwZWVkLgorICovCitzdGF0aWMgaW5saW5lIGludAoraTJjX3JvdW5kcmF0ZShpbnQgaHosIGludCBzcGVlZCwgaW50IGZpbHRlciwgaW50IG1vZHZhbCwKKwkJaW50ICpicmd2YWwsIGludCAqdG90c3BlZWQpCit7CisgICAgaW50IG1vZGRpdiA9IDEgPDwgKDUtKG1vZHZhbCAmIDMpKSwgYnJnZGl2LCBkaXY7CisKKyAgICBQUklOVEQoKCJcdFtJMkNdIHRyeWluZyBoej0lZCwgc3BlZWQ9JWQsIGZpbHRlcj0lZCwgbW9kdmFsPSVkXG4iLAorCWh6LCBzcGVlZCwgZmlsdGVyLCBtb2R2YWwpKTsKKworICAgIGRpdiA9IG1vZGRpdiAqIHNwZWVkOworICAgIGJyZ2RpdiA9IChoeiArIGRpdiAtIDEpIC8gZGl2OworCisgICAgUFJJTlREKCgiXHRcdG1vZGRpdj0lZCwgYnJnZGl2PSVkXG4iLCBtb2RkaXYsIGJyZ2RpdikpOworCisgICAgKmJyZ3ZhbCA9ICgoYnJnZGl2ICsgMSkgLyAyKSAtIDMgLSAoMipmaWx0ZXIpOworCisgICAgaWYgKCgqYnJndmFsIDwgMCkgfHwgKCpicmd2YWwgPiAyNTUpKSB7CisJICBQUklOVEQoKCJcdFx0cmVqZWN0ZWQgYnJndmFsPSVkXG4iLCAqYnJndmFsKSk7CisJICByZXR1cm4gLTE7CisgICAgfQorCisgICAgYnJnZGl2ID0gMiAqICgqYnJndmFsICsgMyArICgyICogZmlsdGVyKSk7CisgICAgZGl2ID0gbW9kZGl2ICogYnJnZGl2IDsKKyAgICAqdG90c3BlZWQgPSBoeiAvIGRpdjsKKworICAgIFBSSU5URCgoIlx0XHRhY2NlcHRlZCBicmd2YWw9JWQsIHRvdHNwZWVkPSVkXG4iLCAqYnJndmFsLCAqdG90c3BlZWQpKTsKKworICAgIHJldHVybiAgMDsKK30KKworLyoKKyAqIFNldHMgdGhlIEkyQyBjbG9jayBwcmVkaXZpZGVyIGFuZCBkaXZpZGVyIHRvIG1lZXQgcmVxdWlyZWQgY2xvY2sgc3BlZWQuCisgKi8KK3N0YXRpYyBpbnQgaTJjX3NldHJhdGUoaW50IGh6LCBpbnQgc3BlZWQpCit7CisgICAgaW1tYXBfdAkqaW1tYXAgPSAoaW1tYXBfdCAqKUNPTkZJR19TWVNfSU1NUiA7CisgICAgdm9sYXRpbGUgaTJjODI2MF90ICppMmMgPSAoaTJjODI2MF90ICopJmltbWFwLT5pbV9pMmM7CisgICAgaW50IGJyZ3ZhbCwKKwkgIG1vZHZhbCwJLyogMC0zICovCisJICBiZXN0c3BlZWRfZGlmZiA9IHNwZWVkLAorCSAgYmVzdHNwZWVkX2JyZ3ZhbD0wLAorCSAgYmVzdHNwZWVkX21vZHZhbD0wLAorCSAgYmVzdHNwZWVkX2ZpbHRlcj0wLAorCSAgdG90c3BlZWQsCisJICBmaWx0ZXIgPSAwOyAvKiBVc2UgdGhpcyBmaXhlZCB2YWx1ZSAqLworCisJZm9yIChtb2R2YWwgPSAwOyBtb2R2YWwgPCA0OyBtb2R2YWwrKykKKwl7CisJCWlmIChpMmNfcm91bmRyYXRlIChoeiwgc3BlZWQsIGZpbHRlciwgbW9kdmFsLCAmYnJndmFsLCAmdG90c3BlZWQpID09IDApCisJCXsKKwkJCWludCBkaWZmID0gc3BlZWQgLSB0b3RzcGVlZCA7CisKKwkJCWlmICgoZGlmZiA+PSAwKSAmJiAoZGlmZiA8IGJlc3RzcGVlZF9kaWZmKSkKKwkJCXsKKwkJCQliZXN0c3BlZWRfZGlmZgk9IGRpZmYgOworCQkJCWJlc3RzcGVlZF9tb2R2YWwJPSBtb2R2YWw7CisJCQkJYmVzdHNwZWVkX2JyZ3ZhbAk9IGJyZ3ZhbDsKKwkJCQliZXN0c3BlZWRfZmlsdGVyCT0gZmlsdGVyOworCQkJfQorCQl9CisJfQorCisgICAgUFJJTlREKCgiW0kyQ10gQmVzdCBpczpcbiIpKTsKKyAgICBQUklOVEQoKCJbSTJDXSBDUFU9JWRoeiBSQVRFPSVkIEY9JWQgSTJNT0Q9JTA4eCBJMkJSRz0lMDh4IERJRkY9JWRoelxuIiwKKwkJICAgaHosIHNwZWVkLAorCQkgICBiZXN0c3BlZWRfZmlsdGVyLCBiZXN0c3BlZWRfbW9kdmFsLCBiZXN0c3BlZWRfYnJndmFsLAorCQkgICBiZXN0c3BlZWRfZGlmZikpOworCisgICAgaTJjLT5pMmNfaTJtb2QgfD0gKChiZXN0c3BlZWRfbW9kdmFsICYgMykgPDwgMSkgfCAoYmVzdHNwZWVkX2ZpbHRlciA8PCAzKTsKKyAgICBpMmMtPmkyY19pMmJyZyA9IGJlc3RzcGVlZF9icmd2YWwgJiAweGZmOworCisgICAgUFJJTlREKCgiW0kyQ10gaTJtb2Q9JTA4eCBpMmJyZz0lMDh4XG4iLCBpMmMtPmkyY19pMm1vZCwgaTJjLT5pMmNfaTJicmcpKTsKKworICAgIHJldHVybiAxIDsKK30KKwordm9pZCBpMmNfaW5pdChpbnQgc3BlZWQsIGludCBzbGF2ZWFkZCkKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1hcCA9IChpbW1hcF90ICopQ09ORklHX1NZU19JTU1SIDsKKwl2b2xhdGlsZSBjcG04MjYwX3QgKmNwID0gKGNwbTgyNjBfdCAqKSZpbW1hcC0+aW1fY3BtOworCXZvbGF0aWxlIGkyYzgyNjBfdCAqaTJjCT0gKGkyYzgyNjBfdCAqKSZpbW1hcC0+aW1faTJjOworCXZvbGF0aWxlIGlpY190ICppaXA7CisJdWxvbmcgcmJhc2UsIHRiYXNlOworCXZvbGF0aWxlIEkyQ19CRCAqcnhiZCwgKnR4YmQ7CisJdWludCBkcGFkZHI7CisKKyNpZmRlZiBDT05GSUdfU1lTX0kyQ19JTklUX0JPQVJECisJLyogY2FsbCBib2FyZCBzcGVjaWZpYyBpMmMgYnVzIHJlc2V0IHJvdXRpbmUgYmVmb3JlIGFjY2Vzc2luZyB0aGUgICAqLworCS8qIGVudmlyb25tZW50LCB3aGljaCBtaWdodCBiZSBpbiBhIGNoaXAgb24gdGhhdCBidXMuIEZvciBkZXRhaWxzICAgKi8KKwkvKiBhYm91dCB0aGlzIHByb2JsZW0gc2VlIGRvYy9JMkNfRWRnZV9Db25kaXRpb25zLiAgICAgICAgICAgICAgICAgICovCisJaTJjX2luaXRfYm9hcmQoKTsKKyNlbmRpZgorCisJZHBhZGRyID0gKigodW5zaWduZWQgc2hvcnQqKSgmaW1tYXAtPmltX2RwcmFtYmFzZVtQUk9GRl9JMkNfQkFTRV0pKTsKKwlpZiAoZHBhZGRyID09IDApIHsKKwkgICAgLyogbmVlZCB0byBhbGxvY2F0ZSBkdWFsIHBvcnQgcmFtICovCisJICAgIGRwYWRkciA9IG04MjYwX2NwbV9kcGFsbG9jKDY0ICsKKwkJKE5VTV9SWF9CRFMgKiBzaXplb2YoSTJDX0JEKSkgKyAoTlVNX1RYX0JEUyAqIHNpemVvZihJMkNfQkQpKSArCisJCU1BWF9UWF9TUEFDRSwgNjQpOworCSAgICAqKCh1bnNpZ25lZCBzaG9ydCopKCZpbW1hcC0+aW1fZHByYW1iYXNlW1BST0ZGX0kyQ19CQVNFXSkpID0gZHBhZGRyOworCX0KKworCS8qCisJICogaW5pdGlhbGlzZSBkYXRhIGluIGR1YWwgcG9ydCByYW06CisJICoKKwkgKgkgIGRwYWRkciAtPiBwYXJhbWV0ZXIgcmFtICg2NCBieXRlcykKKwkgKiAgICAgICAgIHJiYXNlIC0+IHJ4IEJEICAgICAgICAgKE5VTV9SWF9CRFMgKiBzaXplb2YoSTJDX0JEKSBieXRlcykKKwkgKiAgICAgICAgIHRiYXNlIC0+IHR4IEJEICAgICAgICAgKE5VTV9UWF9CRFMgKiBzaXplb2YoSTJDX0JEKSBieXRlcykKKwkgKiAgICAgICAgICAgICAgICAgIHR4IGJ1ZmZlciAgICAgKE1BWF9UWF9TUEFDRSBieXRlcykKKwkgKi8KKworCWlpcCA9IChpaWNfdCAqKSZpbW1hcC0+aW1fZHByYW1iYXNlW2RwYWRkcl07CisJbWVtc2V0KCh2b2lkKilpaXAsIDAsIHNpemVvZihpaWNfdCkpOworCisJcmJhc2UgPSBkcGFkZHIgKyA2NDsKKwl0YmFzZSA9IHJiYXNlICsgTlVNX1JYX0JEUyAqIHNpemVvZihJMkNfQkQpOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCisJaTJjLT5pMmNfaTJtb2QgPSAweDAwOworCWkyYy0+aTJjX2kyY21yID0gMHgwMDsKKwlpMmMtPmkyY19pMmNlciA9IDB4ZmY7CisJaTJjLT5pMmNfaTJhZGQgPSBzbGF2ZWFkZDsKKworCS8qCisJICogU2V0IHRoZSBJMkMgQlJHIENsb2NrIGRpdmlzaW9uIGZhY3RvciBmcm9tIGRlc2lyZWQgaTJjIHJhdGUKKwkgKiBhbmQgY3VycmVudCBDUFUgcmF0ZSAod2UgYXNzdW1lIHNjY3IgZGZiZ3IgZmllbGQgaXMgMDsKKwkgKiBkaXZpZGUgQlJHQ0xLIGJ5IDEpCisJICovCisJUFJJTlREKCgiW0kyQ10gU2V0dGluZyByYXRlLi4uXG4iKSk7CisJaTJjX3NldHJhdGUgKGdkLT5icmdfY2xrLCBDT05GSUdfU1lTX0kyQ19TUEVFRCkgOworCisJLyogU2V0IEkyQyBjb250cm9sbGVyIGluIG1hc3RlciBtb2RlICovCisJaTJjLT5pMmNfaTJjb20gPSAweDAxOworCisJLyogSW5pdGlhbGl6ZSBUeC9SeCBwYXJhbWV0ZXJzICovCisJaWlwLT5paWNfcmJhc2UgPSByYmFzZTsKKwlpaXAtPmlpY190YmFzZSA9IHRiYXNlOworCXJ4YmQgPSAoSTJDX0JEICopKCh1bnNpZ25lZCBjaGFyICopJmltbWFwLT5pbV9kcHJhbWJhc2VbaWlwLT5paWNfcmJhc2VdKTsKKwl0eGJkID0gKEkyQ19CRCAqKSgodW5zaWduZWQgY2hhciAqKSZpbW1hcC0+aW1fZHByYW1iYXNlW2lpcC0+aWljX3RiYXNlXSk7CisKKwlQUklOVEQoKCJbSTJDXSByYmFzZSA9ICUwNHhcbiIsIGlpcC0+aWljX3JiYXNlKSk7CisJUFJJTlREKCgiW0kyQ10gdGJhc2UgPSAlMDR4XG4iLCBpaXAtPmlpY190YmFzZSkpOworCVBSSU5URCgoIltJMkNdIHJ4YmQgPSAlMDh4XG4iLCAoaW50KXJ4YmQpKTsKKwlQUklOVEQoKCJbSTJDXSB0eGJkID0gJTA4eFxuIiwgKGludCl0eGJkKSk7CisKKwkvKiBTZXQgYmlnIGVuZGlhbiBieXRlIG9yZGVyICovCisJaWlwLT5paWNfdGZjciA9IDB4MTA7CisJaWlwLT5paWNfcmZjciA9IDB4MTA7CisKKwkvKiBTZXQgbWF4aW11bSByZWNlaXZlIHNpemUuICovCisJaWlwLT5paWNfbXJibHIgPSBJMkNfUlhUWF9MRU47CisKKyAgICBjcC0+Y3BfY3BjciA9IG1rX2NyX2NtZChDUE1fQ1JfSTJDX1BBR0UsCisJCQkJCQkJQ1BNX0NSX0kyQ19TQkxPQ0ssCisJCQkJCQkJMHgwMCwKKwkJCQkJCQlDUE1fQ1JfSU5JVF9UUlgpIHwgQ1BNX0NSX0ZMRzsKKyAgICBkbyB7CisJCV9fYXNtX18gX192b2xhdGlsZV9fICgiZWllaW8iKTsKKyAgICB9IHdoaWxlIChjcC0+Y3BfY3BjciAmIENQTV9DUl9GTEcpOworCisJLyogQ2xlYXIgZXZlbnRzIGFuZCBpbnRlcnJ1cHRzICovCisJaTJjLT5pMmNfaTJjZXIgPSAweGZmOworCWkyYy0+aTJjX2kyY21yID0gMHgwMDsKK30KKworc3RhdGljCit2b2lkIGkyY19uZXdpbyhpMmNfc3RhdGVfdCAqc3RhdGUpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tYXAgPSAoaW1tYXBfdCAqKUNPTkZJR19TWVNfSU1NUiA7CisJdm9sYXRpbGUgaWljX3QgKmlpcDsKKwl1aW50IGRwYWRkcjsKKworCVBSSU5URCgoIltJMkNdIGkyY19uZXdpb1xuIikpOworCisJZHBhZGRyID0gKigodW5zaWduZWQgc2hvcnQqKSgmaW1tYXAtPmltX2RwcmFtYmFzZVtQUk9GRl9JMkNfQkFTRV0pKTsKKwlpaXAgPSAoaWljX3QgKikmaW1tYXAtPmltX2RwcmFtYmFzZVtkcGFkZHJdOworCXN0YXRlLT5yeF9pZHggPSAwOworCXN0YXRlLT50eF9pZHggPSAwOworCXN0YXRlLT5yeGJkID0gKHZvaWQqKSZpbW1hcC0+aW1fZHByYW1iYXNlW2lpcC0+aWljX3JiYXNlXTsKKwlzdGF0ZS0+dHhiZCA9ICh2b2lkKikmaW1tYXAtPmltX2RwcmFtYmFzZVtpaXAtPmlpY190YmFzZV07CisJc3RhdGUtPnR4X3NwYWNlID0gTUFYX1RYX1NQQUNFOworCXN0YXRlLT50eF9idWYgPSAodWNoYXIqKXN0YXRlLT50eGJkICsgTlVNX1RYX0JEUyAqIHNpemVvZihJMkNfQkQpOworCXN0YXRlLT5lcnJfY2IgPSBOVUxMOworCXN0YXRlLT5jYl9kYXRhID0gTlVMTDsKKworCVBSSU5URCgoIltJMkNdIHJ4YmQgPSAlMDh4XG4iLCAoaW50KXN0YXRlLT5yeGJkKSk7CisJUFJJTlREKCgiW0kyQ10gdHhiZCA9ICUwOHhcbiIsIChpbnQpc3RhdGUtPnR4YmQpKTsKKwlQUklOVEQoKCJbSTJDXSB0eF9idWYgPSAlMDh4XG4iLCAoaW50KXN0YXRlLT50eF9idWYpKTsKKworCS8qIGNsZWFyIHRoZSBidWZmZXIgbWVtb3J5ICovCisJbWVtc2V0KChjaGFyICopc3RhdGUtPnR4X2J1ZiwgMCwgTUFYX1RYX1NQQUNFKTsKK30KKworc3RhdGljCitpbnQgaTJjX3NlbmQoaTJjX3N0YXRlX3QgKnN0YXRlLAorCQkJIHVuc2lnbmVkIGNoYXIgYWRkcmVzcywKKwkJCSB1bnNpZ25lZCBjaGFyIHNlY29uZGFyeV9hZGRyZXNzLAorCQkJIHVuc2lnbmVkIGludCBmbGFncywKKwkJCSB1bnNpZ25lZCBzaG9ydCBzaXplLAorCQkJIHVuc2lnbmVkIGNoYXIgKmRhdGFvdXQpCit7CisJdm9sYXRpbGUgSTJDX0JEICp0eGJkOworCWludCBpLGo7CisKKwlQUklOVEQoKCJbSTJDXSBpMmNfc2VuZCBhZGQ9JTAyZCBzZWM9JTAyZCBmbGFnPSUwMmQgc2l6ZT0lZFxuIiwKKwkJCWFkZHJlc3MsIHNlY29uZGFyeV9hZGRyZXNzLCBmbGFncywgc2l6ZSkpOworCisJLyogdHJ5aW5nIHRvIHNlbmQgbWVzc2FnZSBsYXJnZXIgdGhhbiBCRCAqLworCWlmIChzaXplID4gSTJDX1JYVFhfTEVOKQorCSAgcmV0dXJuIEkyQ0VSUl9NU0dfVE9PX0xPTkc7CisKKwkvKiBubyBtb3JlIGZyZWUgYmRzICovCisJaWYgKHN0YXRlLT50eF9pZHggPj0gTlVNX1RYX0JEUyB8fCBzdGF0ZS0+dHhfc3BhY2UgPCAoMiArIHNpemUpKQorCSAgcmV0dXJuIEkyQ0VSUl9OT19CVUZGRVJTOworCisJdHhiZCA9IChJMkNfQkQgKilzdGF0ZS0+dHhiZDsKKwl0eGJkLT5hZGRyID0gc3RhdGUtPnR4X2J1ZjsKKworCVBSSU5URCgoIltJMkNdIHR4YmQgPSAlMDh4XG4iLCAoaW50KXR4YmQpKTsKKworICAgIGlmIChmbGFncyAmIEkyQ0ZfU1RBUlRfQ09ORCkKKyAgICB7CisJUFJJTlREKCgiW0kyQ10gRm9ybWF0dGluZyBhZGRyZXNzZXMuLi5cbiIpKTsKKwlpZiAoZmxhZ3MgJiBJMkNGX0VOQUJMRV9TRUNPTkRBUlkpCisJeworCQl0eGJkLT5sZW5ndGggPSBzaXplICsgMjsgIC8qIExlbmd0aCBvZiBtZXNzYWdlIHBsdXMgZGVzdCBhZGRyZXNzZXMgKi8KKwkJdHhiZC0+YWRkclswXSA9IGFkZHJlc3MgPDwgMTsKKwkJdHhiZC0+YWRkclsxXSA9IHNlY29uZGFyeV9hZGRyZXNzOworCQlpID0gMjsKKwl9CisJZWxzZQorCXsKKwkJdHhiZC0+bGVuZ3RoID0gc2l6ZSArIDE7ICAvKiBMZW5ndGggb2YgbWVzc2FnZSBwbHVzIGRlc3QgYWRkcmVzcyAqLworCQl0eGJkLT5hZGRyWzBdID0gYWRkcmVzcyA8PCAxOyAgLyogV3JpdGUgZGVzdGluYXRpb24gYWRkcmVzcyB0byBCRCAqLworCQlpID0gMTsKKwl9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJdHhiZC0+bGVuZ3RoID0gc2l6ZTsgIC8qIExlbmd0aCBvZiBtZXNzYWdlICovCisJaSA9IDA7CisgICAgfQorCisJLyogc2V0IHVwIHR4YmQgKi8KKwl0eGJkLT5zdGF0dXMgPSBCRF9TQ19SRUFEWTsKKwlpZiAoZmxhZ3MgJiBJMkNGX1NUQVJUX0NPTkQpCisJICB0eGJkLT5zdGF0dXMgfD0gQkRfSTJDX1RYX1NUQVJUOworCWlmIChmbGFncyAmIEkyQ0ZfU1RPUF9DT05EKQorCSAgdHhiZC0+c3RhdHVzIHw9IEJEX1NDX0xBU1QgfCBCRF9TQ19XUkFQOworCisJLyogQ29weSBkYXRhIHRvIHNlbmQgaW50byBidWZmZXIgKi8KKwlQUklOVEQoKCJbSTJDXSBjb3B5IGRhdGEuLi5cbiIpKTsKKwlmb3IoaiA9IDA7IGogPCBzaXplOyBpKyssIGorKykKKwkgIHR4YmQtPmFkZHJbaV0gPSBkYXRhb3V0W2pdOworCisJUFJJTlREKCgiW0kyQ10gdHhiZDogbGVuZ3RoPTB4JTA0eCBzdGF0dXM9MHglMDR4IGFkZHJbMF09MHglMDJ4IGFkZHJbMV09MHglMDJ4XG4iLAorCQkgICB0eGJkLT5sZW5ndGgsCisJCSAgIHR4YmQtPnN0YXR1cywKKwkJICAgdHhiZC0+YWRkclswXSwKKwkJICAgdHhiZC0+YWRkclsxXSkpOworCisJLyogYWR2YW5jZSBzdGF0ZSAqLworCXN0YXRlLT50eF9idWYgKz0gdHhiZC0+bGVuZ3RoOworCXN0YXRlLT50eF9zcGFjZSAtPSB0eGJkLT5sZW5ndGg7CisJc3RhdGUtPnR4X2lkeCsrOworCXN0YXRlLT50eGJkID0gKHZvaWQqKSh0eGJkICsgMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljCitpbnQgaTJjX3JlY2VpdmUoaTJjX3N0YXRlX3QgKnN0YXRlLAorCQkJCXVuc2lnbmVkIGNoYXIgYWRkcmVzcywKKwkJCQl1bnNpZ25lZCBjaGFyIHNlY29uZGFyeV9hZGRyZXNzLAorCQkJCXVuc2lnbmVkIGludCBmbGFncywKKwkJCQl1bnNpZ25lZCBzaG9ydCBzaXplX3RvX2V4cGVjdCwKKwkJCQl1bnNpZ25lZCBjaGFyICpkYXRhaW4pCit7CisJdm9sYXRpbGUgSTJDX0JEICpyeGJkLCAqdHhiZDsKKworCVBSSU5URCgoIltJMkNdIGkyY19yZWNlaXZlICUwMmQgJTAyZCAlMDJkXG4iLCBhZGRyZXNzLCBzZWNvbmRhcnlfYWRkcmVzcywgZmxhZ3MpKTsKKworCS8qIEV4cGVjdGVkIHRvIHJlY2VpdmUgdG9vIG11Y2ggKi8KKwlpZiAoc2l6ZV90b19leHBlY3QgPiBJMkNfUlhUWF9MRU4pCisJICByZXR1cm4gSTJDRVJSX01TR19UT09fTE9ORzsKKworCS8qIG5vIG1vcmUgZnJlZSBiZHMgKi8KKwlpZiAoc3RhdGUtPnR4X2lkeCA+PSBOVU1fVFhfQkRTIHx8IHN0YXRlLT5yeF9pZHggPj0gTlVNX1JYX0JEUworCQkgfHwgc3RhdGUtPnR4X3NwYWNlIDwgMikKKwkgIHJldHVybiBJMkNFUlJfTk9fQlVGRkVSUzsKKworCXJ4YmQgPSAoSTJDX0JEICopc3RhdGUtPnJ4YmQ7CisJdHhiZCA9IChJMkNfQkQgKilzdGF0ZS0+dHhiZDsKKworCVBSSU5URCgoIltJMkNdIHJ4YmQgPSAlMDh4XG4iLCAoaW50KXJ4YmQpKTsKKwlQUklOVEQoKCJbSTJDXSB0eGJkID0gJTA4eFxuIiwgKGludCl0eGJkKSk7CisKKwl0eGJkLT5hZGRyID0gc3RhdGUtPnR4X2J1ZjsKKworCS8qIHNldCB1cCBUWEJEIGZvciBkZXN0aW5hdGlvbiBhZGRyZXNzICovCisJaWYgKGZsYWdzICYgSTJDRl9FTkFCTEVfU0VDT05EQVJZKQorCXsKKwkJdHhiZC0+bGVuZ3RoID0gMjsKKwkJdHhiZC0+YWRkclswXSA9IGFkZHJlc3MgPDwgMTsgICAvKiBXcml0ZSBkYXRhICovCisJCXR4YmQtPmFkZHJbMV0gPSBzZWNvbmRhcnlfYWRkcmVzczsgIC8qIEludGVybmFsIGFkZHJlc3MgKi8KKwkJdHhiZC0+c3RhdHVzID0gQkRfU0NfUkVBRFk7CisJfQorCWVsc2UKKwl7CisJCXR4YmQtPmxlbmd0aCA9IDEgKyBzaXplX3RvX2V4cGVjdDsKKwkJdHhiZC0+YWRkclswXSA9IChhZGRyZXNzIDw8IDEpIHwgMHgwMTsKKwkJdHhiZC0+c3RhdHVzID0gQkRfU0NfUkVBRFk7CisJCW1lbXNldCgmdHhiZC0+YWRkclsxXSwgMCwgdHhiZC0+bGVuZ3RoKTsKKwl9CisKKwkvKiBzZXQgdXAgcnhiZCBmb3IgcmVjZXB0aW9uICovCisJcnhiZC0+c3RhdHVzID0gQkRfU0NfRU1QVFk7CisJcnhiZC0+bGVuZ3RoID0gc2l6ZV90b19leHBlY3Q7CisJcnhiZC0+YWRkciA9IGRhdGFpbjsKKworCXR4YmQtPnN0YXR1cyB8PSBCRF9JMkNfVFhfU1RBUlQ7CisJaWYgKGZsYWdzICYgSTJDRl9TVE9QX0NPTkQpCisJeworCQl0eGJkLT5zdGF0dXMgfD0gQkRfU0NfTEFTVCB8IEJEX1NDX1dSQVA7CisJCXJ4YmQtPnN0YXR1cyB8PSBCRF9TQ19XUkFQOworCX0KKworCVBSSU5URCgoIltJMkNdIHR4YmQ6IGxlbmd0aD0weCUwNHggc3RhdHVzPTB4JTA0eCBhZGRyWzBdPTB4JTAyeCBhZGRyWzFdPTB4JTAyeFxuIiwKKwkJICAgdHhiZC0+bGVuZ3RoLAorCQkgICB0eGJkLT5zdGF0dXMsCisJCSAgIHR4YmQtPmFkZHJbMF0sCisJCSAgIHR4YmQtPmFkZHJbMV0pKTsKKwlQUklOVEQoKCJbSTJDXSByeGJkOiBsZW5ndGg9MHglMDR4IHN0YXR1cz0weCUwNHggYWRkclswXT0weCUwMnggYWRkclsxXT0weCUwMnhcbiIsCisJCSAgIHJ4YmQtPmxlbmd0aCwKKwkJICAgcnhiZC0+c3RhdHVzLAorCQkgICByeGJkLT5hZGRyWzBdLAorCQkgICByeGJkLT5hZGRyWzFdKSk7CisKKwkvKiBhZHZhbmNlIHN0YXRlICovCisJc3RhdGUtPnR4X2J1ZiArPSB0eGJkLT5sZW5ndGg7CisJc3RhdGUtPnR4X3NwYWNlIC09IHR4YmQtPmxlbmd0aDsKKwlzdGF0ZS0+dHhfaWR4Kys7CisJc3RhdGUtPnR4YmQgPSAodm9pZCopKHR4YmQgKyAxKTsKKwlzdGF0ZS0+cnhfaWR4Kys7CisJc3RhdGUtPnJ4YmQgPSAodm9pZCopKHJ4YmQgKyAxKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYworaW50IGkyY19kb2lvKGkyY19zdGF0ZV90ICpzdGF0ZSkKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1hcCA9IChpbW1hcF90ICopQ09ORklHX1NZU19JTU1SIDsKKwl2b2xhdGlsZSBpaWNfdCAqaWlwOworCXZvbGF0aWxlIGkyYzgyNjBfdCAqaTJjCT0gKGkyYzgyNjBfdCAqKSZpbW1hcC0+aW1faTJjOworCXZvbGF0aWxlIEkyQ19CRCAqdHhiZCwgKnJ4YmQ7CisJaW50ICBuLCBpLCBiLCByeGNudCA9IDAsIHJ4dGltZW8gPSAwLCB0eGNudCA9IDAsIHR4dGltZW8gPSAwLCByYyA9IDA7CisJdWludCBkcGFkZHI7CisKKwlQUklOVEQoKCJbSTJDXSBpMmNfZG9pb1xuIikpOworCisJaWYgKHN0YXRlLT50eF9pZHggPD0gMCAmJiBzdGF0ZS0+cnhfaWR4IDw9IDApIHsKKwkJUFJJTlREKCgiW0kyQ10gTm8gSS9PIGlzIHF1ZXVlZFxuIikpOworCQlyZXR1cm4gSTJDRVJSX1FVRVVFX0VNUFRZOworCX0KKworCWRwYWRkciA9ICooKHVuc2lnbmVkIHNob3J0KikoJmltbWFwLT5pbV9kcHJhbWJhc2VbUFJPRkZfSTJDX0JBU0VdKSk7CisJaWlwID0gKGlpY190ICopJmltbWFwLT5pbV9kcHJhbWJhc2VbZHBhZGRyXTsKKwlpaXAtPmlpY19yYnB0ciA9IGlpcC0+aWljX3JiYXNlOworCWlpcC0+aWljX3RicHRyID0gaWlwLT5paWNfdGJhc2U7CisKKwkvKiBFbmFibGUgSTJDICovCisJUFJJTlREKCgiW0kyQ10gRW5hYmxpbmcgSTJDLi4uXG4iKSk7CisJaTJjLT5pMmNfaTJtb2QgfD0gMHgwMTsKKworCS8qIEJlZ2luIHRyYW5zbWlzc2lvbiAqLworCWkyYy0+aTJjX2kyY29tIHw9IDB4ODA7CisKKwkvKiBMb29wIHVudGlsIHRyYW5zbWl0ICYgcmVjZWl2ZSBjb21wbGV0ZWQgKi8KKworCWlmICgobiA9IHN0YXRlLT50eF9pZHgpID4gMCkgeworCisJCXR4YmQgPSAoKEkyQ19CRCopc3RhdGUtPnR4YmQpIC0gbjsKKwkJZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworCQkJdHh0aW1lbyArPSBUT1VUX0xPT1AgKiB0eGJkLT5sZW5ndGg7CisJCQl0eGJkKys7CisJCX0KKworCQl0eGJkLS07IC8qIHdhaXQgdW50aWwgbGFzdCBpbiBsaXN0IGlzIGRvbmUgKi8KKworCQlQUklOVEQoKCJbSTJDXSBUcmFuc21pdHRpbmcuLi4odHhiZD0weCUwOGx4KVxuIiwgKHVsb25nKXR4YmQpKTsKKworCQl1ZGVsYXkoU1RBUlRfREVMQVlfVVMpOwkvKiBnaXZlIGl0IHRpbWUgdG8gc3RhcnQgKi8KKwkJd2hpbGUoKHR4YmQtPnN0YXR1cyAmIEJEX1NDX1JFQURZKSAmJiAoKyt0eGNudCA8IHR4dGltZW8pKSB7CisJCQl1ZGVsYXkoREVMQVlfVVMpOworCQkJaWYgKGN0cmxjKCkpCisJCQkJcmV0dXJuICgtMSk7CisJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImVpZWlvIik7CisJCX0KKwl9CisKKwlpZiAodHhjbnQgPCB0eHRpbWVvICYmIChuID0gc3RhdGUtPnJ4X2lkeCkgPiAwKSB7CisKKwkJcnhiZCA9ICgoSTJDX0JEKilzdGF0ZS0+cnhiZCkgLSBuOworCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJCQlyeHRpbWVvICs9IFRPVVRfTE9PUCAqIHJ4YmQtPmxlbmd0aDsKKwkJCXJ4YmQrKzsKKwkJfQorCisJCXJ4YmQtLTsgLyogd2FpdCB1bnRpbCBsYXN0IGluIGxpc3QgaXMgZG9uZSAqLworCisJCVBSSU5URCgoIltJMkNdIFJlY2VpdmluZy4uLihyeGJkPTB4JTA4bHgpXG4iLCAodWxvbmcpcnhiZCkpOworCisJCXVkZWxheShTVEFSVF9ERUxBWV9VUyk7CS8qIGdpdmUgaXQgdGltZSB0byBzdGFydCAqLworCQl3aGlsZSgocnhiZC0+c3RhdHVzICYgQkRfU0NfRU1QVFkpICYmICgrK3J4Y250IDwgcnh0aW1lbykpIHsKKwkJCXVkZWxheShERUxBWV9VUyk7CisJCQlpZiAoY3RybGMoKSkKKwkJCQlyZXR1cm4gKC0xKTsKKwkJCV9fYXNtX18gX192b2xhdGlsZV9fICgiZWllaW8iKTsKKwkJfQorCX0KKworCS8qIFR1cm4gb2ZmIEkyQyAqLworCWkyYy0+aTJjX2kybW9kICY9IH4weDAxOworCisJaWYgKChuID0gc3RhdGUtPnR4X2lkeCkgPiAwKSB7CisJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJCXR4YmQgPSAoKEkyQ19CRCopc3RhdGUtPnR4YmQpIC0gKG4gLSBpKTsKKwkJCWlmICgoYiA9IHR4YmQtPnN0YXR1cyAmIEJEX0kyQ19UWF9FUlIpICE9IDApIHsKKwkJCQlpZiAoc3RhdGUtPmVycl9jYiAhPSBOVUxMKQorCQkJCQkoKnN0YXRlLT5lcnJfY2IpKEkyQ0VDQl9UWF9FUlJ8YiwgaSwKKwkJCQkJCXN0YXRlLT5jYl9kYXRhKTsKKwkJCQlpZiAocmMgPT0gMCkKKwkJCQkJcmMgPSBJMkNFUlJfSU9fRVJST1I7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoKG4gPSBzdGF0ZS0+cnhfaWR4KSA+IDApIHsKKwkJZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworCQkJcnhiZCA9ICgoSTJDX0JEKilzdGF0ZS0+cnhiZCkgLSAobiAtIGkpOworCQkJaWYgKChiID0gcnhiZC0+c3RhdHVzICYgQkRfSTJDX1JYX0VSUikgIT0gMCkgeworCQkJCWlmIChzdGF0ZS0+ZXJyX2NiICE9IE5VTEwpCisJCQkJCSgqc3RhdGUtPmVycl9jYikoSTJDRUNCX1JYX0VSUnxiLCBpLAorCQkJCQkJc3RhdGUtPmNiX2RhdGEpOworCQkJCWlmIChyYyA9PSAwKQorCQkJCQlyYyA9IEkyQ0VSUl9JT19FUlJPUjsKKwkJCX0KKwkJfQorCX0KKworCWlmICgodHh0aW1lbyA+IDAgJiYgdHhjbnQgPj0gdHh0aW1lbykgfHwgXAorCSAgICAocnh0aW1lbyA+IDAgJiYgcnhjbnQgPj0gcnh0aW1lbykpIHsKKwkJaWYgKHN0YXRlLT5lcnJfY2IgIT0gTlVMTCkKKwkJCSgqc3RhdGUtPmVycl9jYikoSTJDRUNCX1RJTUVPVVQsIC0xLCBzdGF0ZS0+Y2JfZGF0YSk7CisJCWlmIChyYyA9PSAwKQorCQkJcmMgPSBJMkNFUlJfVElNRU9VVDsKKwl9CisKKwlyZXR1cm4gKHJjKTsKK30KKworc3RhdGljIHZvaWQKK2kyY19wcm9iZV9jYWxsYmFjayhpbnQgZmxhZ3MsIGludCB4bnVtLCB2b2lkICpkYXRhKQoreworCS8qCisJICogdGhlIG9ubHkgYWNjZXB0YWJsZSBlcnJvcnMgYXJlIGEgdHJhbnNtaXQgTkFLIG9yIGEgcmVjZWl2ZQorCSAqIG92ZXJydW4gLSB0eCBOQUsgbWVhbnMgdGhlIGRldmljZSBkb2VzIG5vdCBleGlzdCwgcnggT1YKKwkgKiBtZWFucyB0aGUgZGV2aWNlIG11c3QgaGF2ZSByZXNwb25kZWQgdG8gdGhlIHNsYXZlIGFkZHJlc3MKKwkgKiBldmVuIHRob3VnaCB0aGUgdHJhbnNmZXIgZmFpbGVkCisJICovCisJaWYgKGZsYWdzID09IChJMkNFQ0JfVFhfRVJSfEkyQ0VDQl9UWF9OQUspKQorCQkqKGludCAqKWRhdGEgfD0gMTsKKwlpZiAoZmxhZ3MgPT0gKEkyQ0VDQl9SWF9FUlJ8STJDRUNCX1JYX09WKSkKKwkJKihpbnQgKilkYXRhIHw9IDI7Cit9CisKK2ludAoraTJjX3Byb2JlKHVjaGFyIGNoaXApCit7CisJaTJjX3N0YXRlX3Qgc3RhdGU7CisJaW50IHJjLCBlcnJfZmxhZzsKKwl1Y2hhciBidWZbMV07CisKKwlpMmNfbmV3aW8oJnN0YXRlKTsKKworCXN0YXRlLmVycl9jYiA9IGkyY19wcm9iZV9jYWxsYmFjazsKKwlzdGF0ZS5jYl9kYXRhID0gKHZvaWQgKikgJmVycl9mbGFnOworCWVycl9mbGFnID0gMDsKKworCXJjID0gaTJjX3JlY2VpdmUoJnN0YXRlLCBjaGlwLCAwLCBJMkNGX1NUQVJUX0NPTkR8STJDRl9TVE9QX0NPTkQsIDEsIGJ1Zik7CisKKwlpZiAocmMgIT0gMCkKKwkJcmV0dXJuIChyYyk7CS8qIHByb2JlIGZhaWxlZCAqLworCisJcmMgPSBpMmNfZG9pbygmc3RhdGUpOworCisJaWYgKHJjID09IDApCisJCXJldHVybiAoMCk7CS8qIGRldmljZSBleGlzdHMgLSByZWFkIHN1Y2NlZWRlZCAqLworCisJaWYgKHJjID09IEkyQ0VSUl9USU1FT1VUKQorCQlyZXR1cm4gKC0xKTsJLyogZGV2aWNlIGRvZXMgbm90IGV4aXN0IC0gdGltZW91dCAqLworCisJaWYgKHJjICE9IEkyQ0VSUl9JT19FUlJPUiB8fCBlcnJfZmxhZyA9PSAwKQorCQlyZXR1cm4gKHJjKTsJLyogcHJvYmUgZmFpbGVkICovCisKKwlpZiAoZXJyX2ZsYWcgJiAxKQorCQlyZXR1cm4gKC0xKTsJLyogZGV2aWNlIGRvZXMgbm90IGV4aXN0IC0gaGFkIHRyYW5zbWl0IE5BSyAqLworCisJcmV0dXJuICgwKTsJLyogZGV2aWNlIGV4aXN0cyAtIGhhZCByZWNlaXZlIG92ZXJydW4gKi8KK30KKworCitpbnQKK2kyY19yZWFkKHVjaGFyIGNoaXAsIHVpbnQgYWRkciwgaW50IGFsZW4sIHVjaGFyICpidWZmZXIsIGludCBsZW4pCit7CisJaTJjX3N0YXRlX3Qgc3RhdGU7CisJdWNoYXIgeGFkZHJbNF07CisJaW50IHJjOworCisJeGFkZHJbMF0gPSAoYWRkciA+PiAyNCkgJiAweEZGOworCXhhZGRyWzFdID0gKGFkZHIgPj4gMTYpICYgMHhGRjsKKwl4YWRkclsyXSA9IChhZGRyID4+ICA4KSAmIDB4RkY7CisJeGFkZHJbM10gPSAgYWRkciAgICAgICAgJiAweEZGOworCisjaWZkZWYgQ09ORklHX1NZU19JMkNfRUVQUk9NX0FERFJfT1ZFUkZMT1cKKwkgLyoKKwkgICogRUVQUk9NIGNoaXBzIHRoYXQgaW1wbGVtZW50ICJhZGRyZXNzIG92ZXJmbG93IiBhcmUgb25lcworCSAgKiBsaWtlIENhdGFseXN0IDI0V0MwNC8wOC8xNiB3aGljaCBoYXMgOS8xMC8xMSBiaXRzIG9mIGFkZHJlc3MKKwkgICogYW5kIHRoZSBleHRyYSBiaXRzIGVuZCB1cCBpbiB0aGUgImNoaXAgYWRkcmVzcyIgYml0IHNsb3RzLgorCSAgKiBUaGlzIG1ha2VzIGEgMjRXQzA4ICgxS2J5dGUpIGNoaXAgbG9vayBsaWtlIGZvdXIgMjU2IGJ5dGUKKwkgICogY2hpcHMuCisJICAqCisJICAqIE5vdGUgdGhhdCB3ZSBjb25zaWRlciB0aGUgbGVuZ3RoIG9mIHRoZSBhZGRyZXNzIGZpZWxkIHRvIHN0aWxsCisJICAqIGJlIG9uZSBieXRlIGJlY2F1c2UgdGhlIGV4dHJhIGFkZHJlc3MgYml0cyBhcmUgaGlkZGVuIGluIHRoZQorCSAgKiBjaGlwIGFkZHJlc3MuCisJICAqLworCWNoaXAgfD0gKChhZGRyID4+IChhbGVuICogOCkpICYgQ09ORklHX1NZU19JMkNfRUVQUk9NX0FERFJfT1ZFUkZMT1cpOworI2VuZGlmCisKKwlpMmNfbmV3aW8oJnN0YXRlKTsKKworCXJjID0gaTJjX3NlbmQoJnN0YXRlLCBjaGlwLCAwLCBJMkNGX1NUQVJUX0NPTkQsIGFsZW4sICZ4YWRkcls0LWFsZW5dKTsKKwlpZiAocmMgIT0gMCkgeworCQlwcmludGYoImkyY19yZWFkOiBpMmNfc2VuZCBmYWlsZWQgKCVkKVxuIiwgcmMpOworCQlyZXR1cm4gMTsKKwl9CisKKwlyYyA9IGkyY19yZWNlaXZlKCZzdGF0ZSwgY2hpcCwgMCwgSTJDRl9TVE9QX0NPTkQsIGxlbiwgYnVmZmVyKTsKKwlpZiAocmMgIT0gMCkgeworCQlwcmludGYoImkyY19yZWFkOiBpMmNfcmVjZWl2ZSBmYWlsZWQgKCVkKVxuIiwgcmMpOworCQlyZXR1cm4gMTsKKwl9CisKKwlyYyA9IGkyY19kb2lvKCZzdGF0ZSk7CisJaWYgKHJjICE9IDApIHsKKwkJcHJpbnRmKCJpMmNfcmVhZDogaTJjX2RvaW8gZmFpbGVkICglZClcbiIsIHJjKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitpbnQKK2kyY193cml0ZSh1Y2hhciBjaGlwLCB1aW50IGFkZHIsIGludCBhbGVuLCB1Y2hhciAqYnVmZmVyLCBpbnQgbGVuKQoreworCWkyY19zdGF0ZV90IHN0YXRlOworCXVjaGFyIHhhZGRyWzRdOworCWludCByYzsKKworCXhhZGRyWzBdID0gKGFkZHIgPj4gMjQpICYgMHhGRjsKKwl4YWRkclsxXSA9IChhZGRyID4+IDE2KSAmIDB4RkY7CisJeGFkZHJbMl0gPSAoYWRkciA+PiAgOCkgJiAweEZGOworCXhhZGRyWzNdID0gIGFkZHIgICAgICAgICYgMHhGRjsKKworI2lmZGVmIENPTkZJR19TWVNfSTJDX0VFUFJPTV9BRERSX09WRVJGTE9XCisJIC8qCisJICAqIEVFUFJPTSBjaGlwcyB0aGF0IGltcGxlbWVudCAiYWRkcmVzcyBvdmVyZmxvdyIgYXJlIG9uZXMKKwkgICogbGlrZSBDYXRhbHlzdCAyNFdDMDQvMDgvMTYgd2hpY2ggaGFzIDkvMTAvMTEgYml0cyBvZiBhZGRyZXNzCisJICAqIGFuZCB0aGUgZXh0cmEgYml0cyBlbmQgdXAgaW4gdGhlICJjaGlwIGFkZHJlc3MiIGJpdCBzbG90cy4KKwkgICogVGhpcyBtYWtlcyBhIDI0V0MwOCAoMUtieXRlKSBjaGlwIGxvb2sgbGlrZSBmb3VyIDI1NiBieXRlCisJICAqIGNoaXBzLgorCSAgKgorCSAgKiBOb3RlIHRoYXQgd2UgY29uc2lkZXIgdGhlIGxlbmd0aCBvZiB0aGUgYWRkcmVzcyBmaWVsZCB0byBzdGlsbAorCSAgKiBiZSBvbmUgYnl0ZSBiZWNhdXNlIHRoZSBleHRyYSBhZGRyZXNzIGJpdHMgYXJlIGhpZGRlbiBpbiB0aGUKKwkgICogY2hpcCBhZGRyZXNzLgorCSAgKi8KKwljaGlwIHw9ICgoYWRkciA+PiAoYWxlbiAqIDgpKSAmIENPTkZJR19TWVNfSTJDX0VFUFJPTV9BRERSX09WRVJGTE9XKTsKKyNlbmRpZgorCisJaTJjX25ld2lvKCZzdGF0ZSk7CisKKwlyYyA9IGkyY19zZW5kKCZzdGF0ZSwgY2hpcCwgMCwgSTJDRl9TVEFSVF9DT05ELCBhbGVuLCAmeGFkZHJbNC1hbGVuXSk7CisJaWYgKHJjICE9IDApIHsKKwkJcHJpbnRmKCJpMmNfd3JpdGU6IGZpcnN0IGkyY19zZW5kIGZhaWxlZCAoJWQpXG4iLCByYyk7CisJCXJldHVybiAxOworCX0KKworCXJjID0gaTJjX3NlbmQoJnN0YXRlLCAwLCAwLCBJMkNGX1NUT1BfQ09ORCwgbGVuLCBidWZmZXIpOworCWlmIChyYyAhPSAwKSB7CisJCXByaW50ZigiaTJjX3dyaXRlOiBzZWNvbmQgaTJjX3NlbmQgZmFpbGVkICglZClcbiIsIHJjKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcmMgPSBpMmNfZG9pbygmc3RhdGUpOworCWlmIChyYyAhPSAwKSB7CisJCXByaW50ZigiaTJjX3dyaXRlOiBpMmNfZG9pbyBmYWlsZWQgKCVkKVxuIiwgcmMpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19JMkNfTVVMVElfQlVTKQorLyoKKyAqIEZ1bmN0aW9ucyBmb3IgbXVsdGlwbGUgSTJDIGJ1cyBoYW5kbGluZworICovCit1bnNpZ25lZCBpbnQgaTJjX2dldF9idXNfbnVtKHZvaWQpCit7CisJcmV0dXJuIGkyY19idXNfbnVtOworfQorCitpbnQgaTJjX3NldF9idXNfbnVtKHVuc2lnbmVkIGludCBidXMpCit7CisjaWYgZGVmaW5lZChDT05GSUdfSTJDX01VWCkKKwlpZiAoYnVzIDwgQ09ORklHX1NZU19NQVhfSTJDX0JVUykgeworCQlpMmNfYnVzX251bSA9IGJ1czsKKwl9IGVsc2UgeworCQlpbnQJcmV0OworCisJCXJldCA9IGkyeF9tdXhfc2VsZWN0X211eChidXMpOworCQlpZiAocmV0ID09IDApCisJCQlpMmNfYnVzX251bSA9IGJ1czsKKwkJZWxzZQorCQkJcmV0dXJuIHJldDsKKwl9CisjZWxzZQorCWlmIChidXMgPj0gQ09ORklHX1NZU19NQVhfSTJDX0JVUykKKwkJcmV0dXJuIC0xOworCWkyY19idXNfbnVtID0gYnVzOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZgkvKiBDT05GSUdfSTJDX01VTFRJX0JVUyAqLworI2VuZGlmCS8qIENPTkZJR19IQVJEX0kyQyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjYwL2ludGVycnVwdHMuYyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI2MC9pbnRlcnJ1cHRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYwNmM2MAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI2MC9pbnRlcnJ1cHRzLmMKQEAgLTAsMCArMSwyNzkgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAtMjAwMgorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiBIYWNrZWQgZm9yIE1QQzgyNjAgYnkgTXVycmF5LkplbnNlbkBjbXN0LmNzaXJvLmF1LCAyMi1PY3QtMDAKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPG1wYzgyNjAuaD4KKyNpbmNsdWRlIDxtcGM4MjYwX2lycS5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKworREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgaXJxX2FjdGlvbiB7CisJaW50ZXJydXB0X2hhbmRsZXJfdCAqaGFuZGxlcjsKKwl2b2lkICphcmc7CisJdWxvbmcgY291bnQ7Cit9OworCitzdGF0aWMgc3RydWN0IGlycV9hY3Rpb24gaXJxX2hhbmRsZXJzW05SX0lSUVNdOworCitzdGF0aWMgdWxvbmcgcHBjX2NhY2hlZF9pcnFfbWFza1tOUl9NQVNLX1dPUkRTXTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiB0aGlzIHNlY3Rpb24gd2FzIHJpcHBlZCBvdXQgb2YgYXJjaC9wb3dlcnBjL2tlcm5lbC9wcGM4MjYwX3BpYy5jIGluIHRoZQkgICAgKi8KKy8qIExpbnV4L1BQQyAyLjQueCBzb3VyY2UuIFRoZXJlIHdhcyBubyBjb3B5cmlnaHQgbm90aWNlIGluIHRoYXQgZmlsZS4JICAgICovCisKKy8qIFRoZSA4MjYwIGludGVybmFsIGludGVycnVwdCBjb250cm9sbGVyLiAgSXQgaXMgdXN1YWxseQorICogdGhlIG9ubHkgaW50ZXJydXB0IGNvbnRyb2xsZXIuCisgKiBUaGVyZSBhcmUgdHdvIDMyLWJpdCByZWdpc3RlcnMgKGhpZ2gvbG93KSBmb3IgdXAgdG8gNjQKKyAqIHBvc3NpYmxlIGludGVycnVwdHMuCisgKgorICogTm93LCB0aGUgZnVuIHN0YXJ0cy4uLi4uSW50ZXJydXB0IE51bWJlcnMgRE8gTk9UIE1BUAorICogaW4gYSBzaW1wbGUgYXJpdGhtZXRpYyBmYXNoaW9uIHRvIG1hc2sgb3IgcGVuZGluZyByZWdpc3RlcnMuCisgKiBUaGF0IGlzLCBpbnRlcnJ1cHQgNCBkb2VzIG5vdCBtYXAgdG8gYml0IHBvc2l0aW9uIDQuCisgKiBXZSBjcmVhdGUgdHdvIHRhYmxlcywgaW5kZXhlZCBieSB2ZWN0b3IgbnVtYmVyLCB0byBpbmRpY2F0ZQorICogd2hpY2ggcmVnaXN0ZXIgdG8gdXNlIGFuZCB3aGljaCBiaXQgaW4gdGhlIHJlZ2lzdGVyIHRvIHVzZS4KKyAqLworc3RhdGljIHVfY2hhciBpcnFfdG9fc2l1cmVnW10gPSB7CisJMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKwkxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorCTEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwCit9OworCitzdGF0aWMgdV9jaGFyIGlycV90b19zaXViaXRbXSA9IHsKKwkzMSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsCisJMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwgMjksIDMwLAorCTI5LCAzMCwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwKKwkyMiwgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwgMzEsCisJMCwgMSwgMiwgMywgNCwgNSwgNiwgNywKKwk4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LAorCTE1LCAxNCwgMTMsIDEyLCAxMSwgMTAsIDksIDgsCisJNywgNiwgNSwgNCwgMywgMiwgMSwgMAorfTsKKworc3RhdGljIHZvaWQgbTgyNjBfbWFza19pcnEgKHVuc2lnbmVkIGludCBpcnFfbnIpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tciA9IChpbW1hcF90ICopIENPTkZJR19TWVNfSU1NUjsKKwlpbnQgYml0LCB3b3JkOworCXZvbGF0aWxlIHVpbnQgKnNpbXI7CisKKwliaXQgPSBpcnFfdG9fc2l1Yml0W2lycV9ucl07CisJd29yZCA9IGlycV90b19zaXVyZWdbaXJxX25yXTsKKworCXNpbXIgPSAmKGltbXItPmltX2ludGN0bC5pY19zaW1yaCk7CisJcHBjX2NhY2hlZF9pcnFfbWFza1t3b3JkXSAmPSB+KDEgPDwgKDMxIC0gYml0KSk7CisJc2ltclt3b3JkXSA9IHBwY19jYWNoZWRfaXJxX21hc2tbd29yZF07Cit9CisKK3N0YXRpYyB2b2lkIG04MjYwX3VubWFza19pcnEgKHVuc2lnbmVkIGludCBpcnFfbnIpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tciA9IChpbW1hcF90ICopIENPTkZJR19TWVNfSU1NUjsKKwlpbnQgYml0LCB3b3JkOworCXZvbGF0aWxlIHVpbnQgKnNpbXI7CisKKwliaXQgPSBpcnFfdG9fc2l1Yml0W2lycV9ucl07CisJd29yZCA9IGlycV90b19zaXVyZWdbaXJxX25yXTsKKworCXNpbXIgPSAmKGltbXItPmltX2ludGN0bC5pY19zaW1yaCk7CisJcHBjX2NhY2hlZF9pcnFfbWFza1t3b3JkXSB8PSAoMSA8PCAoMzEgLSBiaXQpKTsKKwlzaW1yW3dvcmRdID0gcHBjX2NhY2hlZF9pcnFfbWFza1t3b3JkXTsKK30KKworc3RhdGljIHZvaWQgbTgyNjBfbWFza19hbmRfYWNrICh1bnNpZ25lZCBpbnQgaXJxX25yKQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltbXIgPSAoaW1tYXBfdCAqKSBDT05GSUdfU1lTX0lNTVI7CisJaW50IGJpdCwgd29yZDsKKwl2b2xhdGlsZSB1aW50ICpzaW1yLCAqc2lwbnI7CisKKwliaXQgPSBpcnFfdG9fc2l1Yml0W2lycV9ucl07CisJd29yZCA9IGlycV90b19zaXVyZWdbaXJxX25yXTsKKworCXNpbXIgPSAmKGltbXItPmltX2ludGN0bC5pY19zaW1yaCk7CisJc2lwbnIgPSAmKGltbXItPmltX2ludGN0bC5pY19zaXBucmgpOworCXBwY19jYWNoZWRfaXJxX21hc2tbd29yZF0gJj0gfigxIDw8ICgzMSAtIGJpdCkpOworCXNpbXJbd29yZF0gPSBwcGNfY2FjaGVkX2lycV9tYXNrW3dvcmRdOworCXNpcG5yW3dvcmRdID0gMSA8PCAoMzEgLSBiaXQpOworfQorCitzdGF0aWMgaW50IG04MjYwX2dldF9pcnEgKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltbXIgPSAoaW1tYXBfdCAqKSBDT05GSUdfU1lTX0lNTVI7CisJaW50IGlycTsKKwl1bnNpZ25lZCBsb25nIGJpdHM7CisKKwkvKiBGb3IgTVBDODI2MCwgcmVhZCB0aGUgU0lWRUMgcmVnaXN0ZXIgYW5kIHNoaWZ0IHRoZSBiaXRzIGRvd24KKwkgKiB0byBnZXQgdGhlIGlycSBudW1iZXIuICAgICAgICAgKi8KKwliaXRzID0gaW1tci0+aW1faW50Y3RsLmljX3NpdmVjOworCWlycSA9IGJpdHMgPj4gMjY7CisJcmV0dXJuIGlycTsKK30KKworLyogZW5kIG9mIGNvZGUgcmlwcGVkIG91dCBvZiBhcmNoL3Bvd2VycGMva2VybmVsL3BwYzgyNjBfcGljLmMJCSAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludCBpbnRlcnJ1cHRfaW5pdF9jcHUgKHVuc2lnbmVkICpkZWNyZW1lbnRlcl9jb3VudCkKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1yID0gKGltbWFwX3QgKikgQ09ORklHX1NZU19JTU1SOworCisJKmRlY3JlbWVudGVyX2NvdW50ID0gKGdkLT5idXNfY2xrIC8gNCkgLyBDT05GSUdfU1lTX0haOworCisJLyogSW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCBpbnRlcnJ1cHQgbWFwcGluZyBwcmlvcml0aWVzICovCisJaW1tci0+aW1faW50Y3RsLmljX3NpY3IgPSAwOworCWltbXItPmltX2ludGN0bC5pY19zaXByciA9IDB4MDUzMDk3NzA7CisJaW1tci0+aW1faW50Y3RsLmljX3NjcHJyaCA9IDB4MDUzMDk3NzA7CisJaW1tci0+aW1faW50Y3RsLmljX3NjcHJybCA9IDB4MDUzMDk3NzA7CisKKwkvKiBkaXNhYmxlIGFsbCBpbnRlcnJ1cHRzIGFuZCBjbGVhciBhbGwgcGVuZGluZyBiaXRzICovCisJaW1tci0+aW1faW50Y3RsLmljX3NpbXJoID0gcHBjX2NhY2hlZF9pcnFfbWFza1swXSA9IDA7CisJaW1tci0+aW1faW50Y3RsLmljX3NpbXJsID0gcHBjX2NhY2hlZF9pcnFfbWFza1sxXSA9IDA7CisJaW1tci0+aW1faW50Y3RsLmljX3NpcG5yaCA9IDB4ZmZmZmZmZmY7CisJaW1tci0+aW1faW50Y3RsLmljX3NpcG5ybCA9IDB4ZmZmZmZmZmY7CisKKyNpZmRlZiBDT05GSUdfSFlNT0QKKwkvKgorCSAqIGVuc3VyZSBhbGwgZXh0ZXJuYWwgaW50ZXJydXB0IHNvdXJjZXMgZGVmYXVsdCB0byB0cmlnZ2VyIG9uCisJICogaGlnaC10by1sb3cgdHJhbnNpdGlvbiAoaS5lLiBlZGdlIHRyaWdnZXJlZCBhY3RpdmUgbG93KQorCSAqLworCWltbXItPmltX2ludGN0bC5pY19zaWV4ciA9IC0xOworI2VuZGlmCisKKwlyZXR1cm4gKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIEhhbmRsZSBleHRlcm5hbCBpbnRlcnJ1cHRzCisgKi8KK3ZvaWQgZXh0ZXJuYWxfaW50ZXJydXB0IChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbnQgaXJxLCB1bm1hc2sgPSAxOworCisJaXJxID0gbTgyNjBfZ2V0X2lycSAocmVncyk7CisKKwltODI2MF9tYXNrX2FuZF9hY2sgKGlycSk7CisKKwllbmFibGVfaW50ZXJydXB0cyAoKTsKKworCWlmIChpcnFfaGFuZGxlcnNbaXJxXS5oYW5kbGVyICE9IE5VTEwpCisJCSgqaXJxX2hhbmRsZXJzW2lycV0uaGFuZGxlcikgKGlycV9oYW5kbGVyc1tpcnFdLmFyZyk7CisJZWxzZSB7CisJCXByaW50ZiAoIlxuQm9ndXMgRXh0ZXJuYWwgSW50ZXJydXB0IElSUSAlZFxuIiwgaXJxKTsKKwkJLyoKKwkJICogdHVybiBvZmYgdGhlIGJvZ3VzIGludGVycnVwdCwgb3RoZXJ3aXNlIGl0CisJCSAqIG1pZ2h0IHJlcGVhdCBmb3JldmVyCisJCSAqLworCQl1bm1hc2sgPSAwOworCX0KKworCWlmICh1bm1hc2spCisJCW04MjYwX3VubWFza19pcnEgKGlycSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogSW5zdGFsbCBhbmQgZnJlZSBhbiBpbnRlcnJ1cHQgaGFuZGxlci4KKyAqLworCit2b2lkCitpcnFfaW5zdGFsbF9oYW5kbGVyIChpbnQgaXJxLCBpbnRlcnJ1cHRfaGFuZGxlcl90ICogaGFuZGxlciwgdm9pZCAqYXJnKQoreworCWlmIChpcnEgPCAwIHx8IGlycSA+PSBOUl9JUlFTKSB7CisJCXByaW50ZiAoImlycV9pbnN0YWxsX2hhbmRsZXI6IGJhZCBpcnEgbnVtYmVyICVkXG4iLCBpcnEpOworCQlyZXR1cm47CisJfQorCisJaWYgKGlycV9oYW5kbGVyc1tpcnFdLmhhbmRsZXIgIT0gTlVMTCkKKwkJcHJpbnRmICgiaXJxX2luc3RhbGxfaGFuZGxlcjogMHglMDhseCByZXBsYWNpbmcgMHglMDhseFxuIiwKKwkJCQkodWxvbmcpIGhhbmRsZXIsICh1bG9uZykgaXJxX2hhbmRsZXJzW2lycV0uaGFuZGxlcik7CisKKwlpcnFfaGFuZGxlcnNbaXJxXS5oYW5kbGVyID0gaGFuZGxlcjsKKwlpcnFfaGFuZGxlcnNbaXJxXS5hcmcgPSBhcmc7CisKKwltODI2MF91bm1hc2tfaXJxIChpcnEpOworfQorCit2b2lkIGlycV9mcmVlX2hhbmRsZXIgKGludCBpcnEpCit7CisJaWYgKGlycSA8IDAgfHwgaXJxID49IE5SX0lSUVMpIHsKKwkJcHJpbnRmICgiaXJxX2ZyZWVfaGFuZGxlcjogYmFkIGlycSBudW1iZXIgJWRcbiIsIGlycSk7CisJCXJldHVybjsKKwl9CisKKwltODI2MF9tYXNrX2lycSAoaXJxKTsKKworCWlycV9oYW5kbGVyc1tpcnFdLmhhbmRsZXIgPSBOVUxMOworCWlycV9oYW5kbGVyc1tpcnFdLmFyZyA9IE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIHRpbWVyX2ludGVycnVwdF9jcHUgKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCS8qIG5vdGhpbmcgdG8gZG8gaGVyZSAqLworCXJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSVJRKQorCisvKiByaXBwZWQgdGhpcyBvdXQgb2YgcHBjNHh4L2ludGVycnVwdHMuYyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBpcnFpbmZvIC0gcHJpbnQgaW5mb3JtYXRpb24gYWJvdXQgUENJIGRldmljZXMKKyoKKyovCit2b2lkCitkb19pcnFpbmZvIChjbWRfdGJsX3QgKiBjbWR0cCwgYmRfdCAqIGJkLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQgaXJxLCByZV9lbmFibGU7CisKKwlyZV9lbmFibGUgPSBkaXNhYmxlX2ludGVycnVwdHMgKCk7CisKKwlwdXRzICgiXG5JbnRlcnJ1cHQtSW5mb3JtYXRpb246XG4iCisJCSJOciAgUm91dGluZSAgIEFyZyAgICAgICBDb3VudFxuIik7CisKKwlmb3IgKGlycSA9IDA7IGlycSA8IDMyOyBpcnErKykKKwkJaWYgKGlycV9oYW5kbGVyc1tpcnFdLmhhbmRsZXIgIT0gTlVMTCkKKwkJCXByaW50ZiAoIiUwMmQgICUwOGx4ICAlMDhseCAgJWxkXG4iLCBpcnEsCisJCQkJCSh1bG9uZykgaXJxX2hhbmRsZXJzW2lycV0uaGFuZGxlciwKKwkJCQkJKHVsb25nKSBpcnFfaGFuZGxlcnNbaXJxXS5hcmcsCisJCQkJCWlycV9oYW5kbGVyc1tpcnFdLmNvdW50KTsKKworCWlmIChyZV9lbmFibGUpCisJCWVuYWJsZV9pbnRlcnJ1cHRzICgpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI2MC9rZ2RiLlMgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgyNjAva2dkYi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1OTM2YzcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgyNjAva2dkYi5TCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAyMDAwCU11cnJheSBKZW5zZW4gPE11cnJheS5KZW5zZW5AY21zdC5jc2lyby5hdT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPG1wYzgyNjAuaD4KKyNpbmNsdWRlIDx2ZXJzaW9uLmg+CisKKyNkZWZpbmUgQ09ORklHXzgyNjAgMQkJLyogbmVlZGVkIGZvciBMaW51eCBrZXJuZWwgaGVhZGVyIGZpbGVzICovCisjZGVmaW5lIF9MSU5VWF9DT05GSUdfSCAxCS8qIGF2b2lkIHJlYWRpbmcgTGludXggYXV0b2NvbmYuaCBmaWxlCSovCisKKyNpbmNsdWRlIDxwcGNfYXNtLnRtcGw+CisjaW5jbHVkZSA8cHBjX2RlZnMuaD4KKworI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgorI2luY2x1ZGUgPGFzbS9tbXUuaD4KKworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQorCisgLyoKKyAqIGNhY2hlIGZsdXNoaW5nIHJvdXRpbmVzIGZvciBrZ2RiCisgKi8KKworCS5nbG9ibAlrZ2RiX2ZsdXNoX2NhY2hlX2FsbAora2dkYl9mbHVzaF9jYWNoZV9hbGw6CisJbWZzcHIJcjMsIEhJRDAKKwlvcmkJcjMsIHIzLCBISUQwX0lDRkl8SElEMF9EQ0kJLyogSW52YWxpZGF0ZSBBbGwgKi8KKwlTWU5DCisJbXRzcHIJSElEMCwgcjMKKwlibHIKKworCS5nbG9ibAlrZ2RiX2ZsdXNoX2NhY2hlX3JhbmdlCitrZ2RiX2ZsdXNoX2NhY2hlX3JhbmdlOgorCWxpCXI1LENPTkZJR19TWVNfQ0FDSEVMSU5FX1NJWkUtMQorCWFuZGMJcjMscjMscjUKKwlzdWJmCXI0LHIzLHI0CisJYWRkCXI0LHI0LHI1CisJc3J3aS4JcjQscjQsQ09ORklHX1NZU19DQUNIRUxJTkVfU0hJRlQKKwliZXFscgorCW10Y3RyCXI0CisJbXIJcjYscjMKKzE6CWRjYnN0CTAscjMKKwlhZGRpCXIzLHIzLENPTkZJR19TWVNfQ0FDSEVMSU5FX1NJWkUKKwliZG56CTFiCisJc3luYwkJCQkvKiB3YWl0IGZvciBkY2JzdCdzIHRvIGdldCB0byByYW0gKi8KKwltdGN0cglyNAorMjoJaWNiaQkwLHI2CisJYWRkaQlyNixyNixDT05GSUdfU1lTX0NBQ0hFTElORV9TSVpFCisJYmRuegkyYgorCVNZTkMKKwlibHIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzgyNjAvcGNpLmMgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgyNjAvcGNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmExNGJhNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI2MC9wY2kuYwpAQCAtMCwwICsxLDQ2NiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMworICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICogVml0YWx5IEJvcmR1ZyA8dmJvcmR1Z0BydS5tdmlzdGEuY29tPgorICogQWRkZWQgc3VwcG9ydCBmb3IgUENJIGJyaWRnZSBvbiBNUEM4MjcyQURTCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorCisjaWZkZWYgQ09ORklHX1BDSQorCisjaW5jbHVkZSA8cGNpLmg+CisjaW5jbHVkZSA8bXBjODI2MC5oPgorI2luY2x1ZGUgPGFzbS9tODI2MF9wY2kuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpZmRlZiBDT05GSUdfT0ZfTElCRkRUCisjaW5jbHVkZSA8bGliZmR0Lmg+CisjaW5jbHVkZSA8ZmR0X3N1cHBvcnQuaD4KKyNlbmRpZgorCisjaWYgZGVmaW5lZCBDT05GSUdfTVBDODI2NkFEUyB8fCBkZWZpbmVkIENPTkZJR19NUEM4MjcyIHx8IGRlZmluZWQgQ09ORklHX1BNODI2CitERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKyNlbmRpZgorCisvKgorICogICBMb2NhbC0+UENJIG1hcCAoZnJvbSBDUFUpCQkJCSAgIGNvbnRyb2xsZWQgYnkKKyAqICAgTVBDODI2eCBtYXN0ZXIgd2luZG93CisgKgorICogICAweDgwMDAwMDAwIC0gMHhCRkZGRkZGRglDUFUyUENJIHNwYWNlCQkgICBQQ0lCUjAKKyAqICAgMHhGNDAwMDAwMCAtIDB4RjdGRkZGRkYJQ1BVMlBDSSBzcGFjZQkJICAgUENJQlIxCisgKgorICogICAweDgwMDAwMDAwIC0gMHg5RkZGRkZGRgkweDgwMDAwMDAwIC0gMHg5RkZGRkZGRgkgIChPdXRib3VuZCBBVFUgIzEpCisgKgkJCQlQQ0kgTWVtIHdpdGggcHJlZmV0Y2gKKyAqCisgKiAgIDB4QTAwMDAwMDAgLSAweEJGRkZGRkZGCTB4QTAwMDAwMDAgLSAweEJGRkZGRkZGCSAgKE91dGJvdW5kIEFUVSAjMikKKyAqCQkJCVBDSSBNZW0gdy9vICBwcmVmZXRjaAorICoKKyAqICAgMHhGNDAwMDAwMCAtIDB4RjdGRkZGRkYJMHgwMDAwMDAwMCAtIDB4MDNGRkZGRkYJICAoT3V0Ym91bmQgQVRVICMzKQorICoJCQkJMzItYml0IFBDSSBJTworICoKKyAqICAgUENJLT5Mb2NhbCBtYXAgKGZyb20gUENJKQorICogICBNUEM4MjZ4IHNsYXZlIHdpbmRvdwkJCQkgICBjb250cm9sbGVkIGJ5CisgKgorICogICAweDAwMDAwMDAwIC0gMHgxRkZGRkZGRgkweDAwMDAwMDAwIC0gMHgxRkZGRkZGRgkgIChJbmJvdW5kIEFUVSAjMSkKKyAqCQkJCU1QQzgyNnggbG9jYWwgbWVtb3J5CisgKi8KKworLyoKKyAqIFNsYXZlIHdpbmRvdyB0aGF0IGFsbG93cyBQQ0kgbWFzdGVycyB0byBhY2Nlc3MgTVBDODI2eCBsb2NhbCBtZW1vcnkuCisgKiBUaGlzIHdpbmRvdyBpcyBzZXQgdXAgdXNpbmcgdGhlIGZpcnN0IHNldCBvZiBJbmJvdW5kIEFUVSByZWdpc3RlcnMKKyAqLworCisjaWZuZGVmIENPTkZJR19TWVNfUENJX1NMVl9NRU1fTE9DQUwKKyNkZWZpbmUgUENJX1NMVl9NRU1fTE9DQUwgQ09ORklHX1NZU19TRFJBTV9CQVNFCS8qIExvY2FsIGJhc2UgKi8KKyNlbHNlCisjZGVmaW5lIFBDSV9TTFZfTUVNX0xPQ0FMIENPTkZJR19TWVNfUENJX1NMVl9NRU1fTE9DQUwKKyNlbmRpZgorCisjaWZuZGVmIENPTkZJR19TWVNfUENJX1NMVl9NRU1fQlVTCisjZGVmaW5lIFBDSV9TTFZfTUVNX0JVUyAweDAwMDAwMDAwCS8qIFBDSSBiYXNlICovCisjZWxzZQorI2RlZmluZSBQQ0lfU0xWX01FTV9CVVMgQ09ORklHX1NZU19QQ0lfU0xWX01FTV9CVVMKKyNlbmRpZgorCisjaWZuZGVmIENPTkZJR19TWVNfUElDTVIwX01BU0tfQVRUUklCCisjZGVmaW5lIFBJQ01SMF9NQVNLX0FUVFJJQgkoUElDTVJfTUFTS181MTJNQiB8IFBJQ01SX0VOQUJMRSB8IFwKKwkJCQkgUElDTVJfUFJFRkVUQ0hfRU4pCisjZWxzZQorI2RlZmluZSBQSUNNUjBfTUFTS19BVFRSSUIgQ09ORklHX1NZU19QSUNNUjBfTUFTS19BVFRSSUIKKyNlbmRpZgorCisvKgorICogVGhlc2UgYXJlIHRoZSB3aW5kb3dzIHRoYXQgYWxsb3cgdGhlIENQVSB0byBhY2Nlc3MgUENJIGFkZHJlc3Mgc3BhY2UuCisgKiBBbGwgdGhyZWUgUENJIG1hc3RlciB3aW5kb3dzLCB3aGljaCBhbGxvdyB0aGUgQ1BVIHRvIGFjY2VzcyBQQ0kKKyAqIHByZWZldGNoLCBub24gcHJlZmV0Y2gsIGFuZCBJTyBzcGFjZSAoc2VlIGJlbG93KSwgbXVzdCBhbGwgZml0IHdpdGhpbgorICogdGhlc2Ugd2luZG93cy4KKyAqLworCisvKiBQQ0lCUjAgKi8KKyNpZm5kZWYgQ09ORklHX1NZU19QQ0lfTVNUUjBfTE9DQUwKKyNkZWZpbmUgUENJX01TVFIwX0xPQ0FMCQkweDgwMDAwMDAwCS8qIExvY2FsIGJhc2UgKi8KKyNlbHNlCisjZGVmaW5lIFBDSV9NU1RSMF9MT0NBTCBDT05GSUdfU1lTX1BDSV9NU1RSMF9MT0NBTAorI2VuZGlmCisKKyNpZm5kZWYgQ09ORklHX1NZU19QQ0lNU0swX01BU0sKKyNkZWZpbmUgUENJTVNLMF9NQVNLCQlQQ0lNU0tfMUdCCS8qIFNpemUgb2Ygd2luZG93ICovCisjZWxzZQorI2RlZmluZSBQQ0lNU0swX01BU0sJQ09ORklHX1NZU19QQ0lNU0swX01BU0sKKyNlbmRpZgorCisvKiBQQ0lCUjEgKi8KKyNpZm5kZWYgQ09ORklHX1NZU19QQ0lfTVNUUjFfTE9DQUwKKyNkZWZpbmUgUENJX01TVFIxX0xPQ0FMCQkweEY0MDAwMDAwCS8qIExvY2FsIGJhc2UgKi8KKyNlbHNlCisjZGVmaW5lIFBDSV9NU1RSMV9MT0NBTAkJQ09ORklHX1NZU19QQ0lfTVNUUjFfTE9DQUwKKyNlbmRpZgorCisjaWZuZGVmIENPTkZJR19TWVNfUENJTVNLMV9NQVNLCisjZGVmaW5lCSBQQ0lNU0sxX01BU0sJCVBDSU1TS182NE1CCS8qIFNpemUgb2Ygd2luZG93ICovCisjZWxzZQorI2RlZmluZQkgUENJTVNLMV9NQVNLCQlDT05GSUdfU1lTX1BDSU1TSzFfTUFTSworI2VuZGlmCisKKy8qCisgKiBNYXN0ZXIgd2luZG93IHRoYXQgYWxsb3dzIHRoZSBDUFUgdG8gYWNjZXNzIFBDSSBNZW1vcnkgKHByZWZldGNoKS4KKyAqIFRoaXMgd2luZG93IHdpbGwgYmUgc2V0dXAgd2l0aCB0aGUgZmlyc3Qgc2V0IG9mIE91dGJvdW5kIEFUVSByZWdpc3RlcnMKKyAqIGluIHRoZSBicmlkZ2UuCisgKi8KKworI2lmbmRlZiBDT05GSUdfU1lTX1BDSV9NU1RSX01FTV9MT0NBTAorI2RlZmluZSBQQ0lfTVNUUl9NRU1fTE9DQUwgMHg4MDAwMDAwMAkvKiBMb2NhbCBiYXNlICovCisjZWxzZQorI2RlZmluZSBQQ0lfTVNUUl9NRU1fTE9DQUwgQ09ORklHX1NZU19QQ0lfTVNUUl9NRU1fTE9DQUwKKyNlbmRpZgorCisjaWZuZGVmIENPTkZJR19TWVNfUENJX01TVFJfTUVNX0JVUworI2RlZmluZSBQQ0lfTVNUUl9NRU1fQlVTIDB4ODAwMDAwMDAJLyogUENJIGJhc2UgICAqLworI2Vsc2UKKyNkZWZpbmUgUENJX01TVFJfTUVNX0JVUyBDT05GSUdfU1lTX1BDSV9NU1RSX01FTV9CVVMKKyNlbmRpZgorCisjaWZuZGVmIENPTkZJR19TWVNfQ1BVX1BDSV9NRU1fU1RBUlQKKyNkZWZpbmUgQ1BVX1BDSV9NRU1fU1RBUlQgUENJX01TVFJfTUVNX0xPQ0FMCisjZWxzZQorI2RlZmluZSBDUFVfUENJX01FTV9TVEFSVCBDT05GSUdfU1lTX0NQVV9QQ0lfTUVNX1NUQVJUCisjZW5kaWYKKworI2lmbmRlZiBDT05GSUdfU1lTX1BDSV9NU1RSX01FTV9TSVpFCisjZGVmaW5lIFBDSV9NU1RSX01FTV9TSVpFIDB4MTAwMDAwMDAJLyogMjU2TUIgKi8KKyNlbHNlCisjZGVmaW5lIFBDSV9NU1RSX01FTV9TSVpFIENPTkZJR19TWVNfUENJX01TVFJfTUVNX1NJWkUKKyNlbmRpZgorCisjaWZuZGVmIENPTkZJR19TWVNfUE9DTVIwX01BU0tfQVRUUklCCisjZGVmaW5lIFBPQ01SMF9NQVNLX0FUVFJJQgkoUE9DTVJfTUFTS18yNTZNQiB8IFBPQ01SX0VOQUJMRSB8IFBPQ01SX1BSRUZFVENIX0VOKQorI2Vsc2UKKyNkZWZpbmUgUE9DTVIwX01BU0tfQVRUUklCIENPTkZJR19TWVNfUE9DTVIwX01BU0tfQVRUUklCCisjZW5kaWYKKworLyoKKyAqIE1hc3RlciB3aW5kb3cgdGhhdCBhbGxvd3MgdGhlIENQVSB0byBhY2Nlc3MgUENJIE1lbW9yeSAobm9uLXByZWZldGNoKS4KKyAqIFRoaXMgd2luZG93IHdpbGwgYmUgc2V0dXAgd2l0aCB0aGUgc2Vjb25kIHNldCBvZiBPdXRib3VuZCBBVFUgcmVnaXN0ZXJzCisgKiBpbiB0aGUgYnJpZGdlLgorICovCisKKyNpZm5kZWYgQ09ORklHX1NZU19QQ0lfTVNUUl9NRU1JT19MT0NBTAorI2RlZmluZSBQQ0lfTVNUUl9NRU1JT19MT0NBTCAweDkwMDAwMDAwIC8qIExvY2FsIGJhc2UgKi8KKyNlbHNlCisjZGVmaW5lIFBDSV9NU1RSX01FTUlPX0xPQ0FMIENPTkZJR19TWVNfUENJX01TVFJfTUVNSU9fTE9DQUwKKyNlbmRpZgorCisjaWZuZGVmIENPTkZJR19TWVNfUENJX01TVFJfTUVNSU9fQlVTCisjZGVmaW5lIFBDSV9NU1RSX01FTUlPX0JVUyAweDkwMDAwMDAwCS8qIFBDSSBiYXNlICAgKi8KKyNlbHNlCisjZGVmaW5lIFBDSV9NU1RSX01FTUlPX0JVUyBDT05GSUdfU1lTX1BDSV9NU1RSX01FTUlPX0JVUworI2VuZGlmCisKKyNpZm5kZWYgQ09ORklHX1NZU19DUFVfUENJX01FTUlPX1NUQVJUCisjZGVmaW5lIENQVV9QQ0lfTUVNSU9fU1RBUlQgUENJX01TVFJfTUVNSU9fTE9DQUwKKyNlbHNlCisjZGVmaW5lIENQVV9QQ0lfTUVNSU9fU1RBUlQgQ09ORklHX1NZU19DUFVfUENJX01FTUlPX1NUQVJUCisjZW5kaWYKKworI2lmbmRlZiBDT05GSUdfU1lTX1BDSV9NU1RSX01FTUlPX1NJWkUKKyNkZWZpbmUgUENJX01TVFJfTUVNSU9fU0laRSAweDEwMDAwMDAwCS8qIDI1NiBNQiAqLworI2Vsc2UKKyNkZWZpbmUgUENJX01TVFJfTUVNSU9fU0laRSBDT05GSUdfU1lTX1BDSV9NU1RSX01FTUlPX1NJWkUKKyNlbmRpZgorCisjaWZuZGVmIENPTkZJR19TWVNfUE9DTVIxX01BU0tfQVRUUklCCisjZGVmaW5lIFBPQ01SMV9NQVNLX0FUVFJJQgkoUE9DTVJfTUFTS181MTJNQiB8IFBPQ01SX0VOQUJMRSkKKyNlbHNlCisjZGVmaW5lIFBPQ01SMV9NQVNLX0FUVFJJQiBDT05GSUdfU1lTX1BPQ01SMV9NQVNLX0FUVFJJQgorI2VuZGlmCisKKy8qCisgKiBNYXN0ZXIgd2luZG93IHRoYXQgYWxsb3dzIHRoZSBDUFUgdG8gYWNjZXNzIFBDSSBJTyBzcGFjZS4KKyAqIFRoaXMgd2luZG93IHdpbGwgYmUgc2V0dXAgd2l0aCB0aGUgdGhpcmQgc2V0IG9mIE91dGJvdW5kIEFUVSByZWdpc3RlcnMKKyAqIGluIHRoZSBicmlkZ2UuCisgKi8KKworI2lmbmRlZiBDT05GSUdfU1lTX1BDSV9NU1RSX0lPX0xPQ0FMCisjZGVmaW5lIFBDSV9NU1RSX0lPX0xPQ0FMIDB4QTAwMDAwMDAJLyogTG9jYWwgYmFzZSAqLworI2Vsc2UKKyNkZWZpbmUgUENJX01TVFJfSU9fTE9DQUwgQ09ORklHX1NZU19QQ0lfTVNUUl9JT19MT0NBTAorI2VuZGlmCisKKyNpZm5kZWYgQ09ORklHX1NZU19QQ0lfTVNUUl9JT19CVVMKKyNkZWZpbmUgUENJX01TVFJfSU9fQlVTIDB4QTAwMDAwMDAJLyogUENJIGJhc2UgICAqLworI2Vsc2UKKyNkZWZpbmUgUENJX01TVFJfSU9fQlVTIENPTkZJR19TWVNfUENJX01TVFJfSU9fQlVTCisjZW5kaWYKKworI2lmbmRlZiBDT05GSUdfU1lTX0NQVV9QQ0lfSU9fU1RBUlQKKyNkZWZpbmUgQ1BVX1BDSV9JT19TVEFSVCBQQ0lfTVNUUl9JT19MT0NBTAorI2Vsc2UKKyNkZWZpbmUgQ1BVX1BDSV9JT19TVEFSVCBDT05GSUdfU1lTX0NQVV9QQ0lfSU9fU1RBUlQKKyNlbmRpZgorCisjaWZuZGVmIENPTkZJR19TWVNfUENJX01TVFJfSU9fU0laRQorI2RlZmluZSBQQ0lfTVNUUl9JT19TSVpFIDB4MTAwMDAwMDAJLyogMjU2TUIgKi8KKyNlbHNlCisjZGVmaW5lIFBDSV9NU1RSX0lPX1NJWkUgQ09ORklHX1NZU19QQ0lfTVNUUl9JT19TSVpFCisjZW5kaWYKKworI2lmbmRlZiBDT05GSUdfU1lTX1BPQ01SMl9NQVNLX0FUVFJJQgorI2RlZmluZSBQT0NNUjJfTUFTS19BVFRSSUIJKFBPQ01SX01BU0tfMjU2TUIgfCBQT0NNUl9FTkFCTEUgfCBQT0NNUl9QQ0lfSU8pCisjZWxzZQorI2RlZmluZSBQT0NNUjJfTUFTS19BVFRSSUIgQ09ORklHX1NZU19QT0NNUjJfTUFTS19BVFRSSUIKKyNlbmRpZgorCisvKiBQQ0kgYnVzIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzLgorICovCisKKyNkZWZpbmUgUENJX0NMQVNTX0JSSURHRV9DVExSCTB4MDYKKworCitzdGF0aWMgaW5saW5lIHZvaWQgcGNpX291dGwgKHUzMiBhZGRyLCB1MzIgZGF0YSkKK3sKKwkqKHZvbGF0aWxlIHUzMiAqKSBhZGRyID0gY3B1X3RvX2xlMzIgKGRhdGEpOworfQorCit2b2lkIHBjaV9tcGM4MjUwX2luaXQgKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSkKK3sKKwl1MTYgdGVtcFNob3J0OworCisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tYXAgPSAoaW1tYXBfdCAqKSBDT05GSUdfU1lTX0lNTVI7CisJcGNpX2Rldl90IGhvc3RfZGV2bm8gPSBQQ0lfQkRGICgwLCAwLCAwKTsKKworCXBjaV9zZXR1cF9pbmRpcmVjdCAoaG9zZSwgQ09ORklHX1NZU19JTU1SICsgUENJX0NGR19BRERSX1JFRywKKwkJCSAgICBDT05GSUdfU1lTX0lNTVIgKyBQQ0lfQ0ZHX0RBVEFfUkVHKTsKKworCS8qCisJICogU2V0dGluZyByZXF1aXJlZCB0byBlbmFibGUgbG9jYWwgYnVzIGZvciBQQ0kgKFNJVU1DUiBbTEJQQ10pLgorCSAqLworI2lmZGVmIENPTkZJR19NUEM4MjY2QURTCisJaW1tYXAtPmltX3NpdV9jb25mLnNjX3NpdW1jciA9CisJCShpbW1hcC0+aW1fc2l1X2NvbmYuc2Nfc2l1bWNyICYgflNJVU1DUl9MQlBDMTEpCisJCXwgU0lVTUNSX0xCUEMwMTsKKyNlbGlmIGRlZmluZWQoQ09ORklHX0FEU1RZUEUpICYmIENPTkZJR19BRFNUWVBFID09IENPTkZJR19TWVNfUFEyRkFEUworLyogbm90aGluZyB0byBkbyBmb3IgdGhpcyBib2FyZCBoZXJlICovCisjZWxpZiBkZWZpbmVkIENPTkZJR19NUEM4MjcyCisJaW1tYXAtPmltX3NpdV9jb25mLnNjX3NpdW1jciA9IChpbW1hcC0+aW1fc2l1X2NvbmYuc2Nfc2l1bWNyICYKKwkJCQkgIH5TSVVNQ1JfQkJEICYKKwkJCQkgIH5TSVVNQ1JfRVNFICYKKwkJCQkgIH5TSVVNQ1JfUEJTRSAmCisJCQkJICB+U0lVTUNSX0NESVMgJgorCQkJCSAgflNJVU1DUl9EUFBDMTEgJgorCQkJCSAgflNJVU1DUl9MMkNQQzExICYKKwkJCQkgIH5TSVVNQ1JfTEJQQzExICYKKwkJCQkgIH5TSVVNQ1JfQVBQQzExICYKKwkJCQkgIH5TSVVNQ1JfQ1MxMFBDMTEgJgorCQkJCSAgflNJVU1DUl9CQ1RMQzExICYKKwkJCQkgIH5TSVVNQ1JfTU1SMTEpCisJCQkJICB8IFNJVU1DUl9EUFBDMTEKKwkJCQkgIHwgU0lVTUNSX0wyQ1BDMDEKKwkJCQkgIHwgU0lVTUNSX0xCUEMwMAorCQkJCSAgfCBTSVVNQ1JfQVBQQzEwCisJCQkJICB8IFNJVU1DUl9DUzEwUEMwMAorCQkJCSAgfCBTSVVNQ1JfQkNUTEMwMAorCQkJCSAgfCBTSVVNQ1JfTU1SMTE7CisjZWxpZiBkZWZpbmVkKENPTkZJR19UUU04MjcyKQorLyogbm90aGluZyB0byBkbyBmb3IgdGhpcyBCb2FyZCBoZXJlICovCisjZWxzZQorCS8qCisJICogU2V0dGluZyByZXF1aXJlZCB0byBlbmFibGUgSVJRMS1JUlE3IChTSVVNQ1IgW0RQUENdKSwKKwkgKiBhbmQgbG9jYWwgYnVzIGZvciBQQ0kgKFNJVU1DUiBbTEJQQ10pLgorCSAqLworCWltbWFwLT5pbV9zaXVfY29uZi5zY19zaXVtY3IgPSAoaW1tYXAtPmltX3NpdV9jb25mLnNjX3NpdW1jciAmCisJCQkJCQl+U0lVTUNSX0xCUEMxMSAmCisJCQkJCQl+U0lVTUNSX0NTMTBQQzExICYKKwkJCQkJCX5TSVVNQ1JfTEJQQzExKSB8CisJCQkJCVNJVU1DUl9MQlBDMDEgfAorCQkJCQlTSVVNQ1JfQ1MxMFBDMDEgfAorCQkJCQlTSVVNQ1JfQVBQQzEwOworI2VuZGlmCisKKwkvKiBNYWtlIFBDSSBsb3dlc3QgcHJpb3JpdHkgKi8KKwkvKiBFYWNoIDQgYml0cyBpcyBhIGRldmljZSBidXMgcmVxdWVzdAlhbmQgdGhlIE1TIDRiaXRzCisJICAgaXMgaGlnaGVzdCBwcmlvcml0eSAqLworCS8qIEJ1cwkJICAgICA0Yml0IHZhbHVlCisJICAgLS0tCQkgICAgIC0tLS0tLS0tLS0KKwkgICBDUE0gaGlnaAkgICAgIDBiMDAwMAorCSAgIENQTSBtaWRkbGUJICAgICAwYjAwMDEKKwkgICBDUE0gbG93CSAgICAgMGIwMDEwCisJICAgUENJIHJlZ3Vlc3QJICAgICAwYjAwMTEKKwkgICBSZXNlcnZlZAkgICAgIDBiMDEwMAorCSAgIFJlc2VydmVkCSAgICAgMGIwMTAxCisJICAgSW50ZXJuYWwgQ29yZSAgICAgMGIwMTEwCisJICAgRXh0ZXJuYWwgTWFzdGVyIDEgMGIwMTExCisJICAgRXh0ZXJuYWwgTWFzdGVyIDIgMGIxMDAwCisJICAgRXh0ZXJuYWwgTWFzdGVyIDMgMGIxMDAxCisJICAgVGhlIHJlc3QgYXJlIHJlc2VydmVkICovCisJaW1tYXAtPmltX3NpdV9jb25mLnNjX3BwY19hbHJoID0gMHg2MTIwNzg5MzsKKworCS8qIFBhcmsgYnVzIG9uIGNvcmUgd2hpbGUgbW9kaWZ5aW5nIFBDSSBCdXMgYWNjZXNzZXMgKi8KKwlpbW1hcC0+aW1fc2l1X2NvbmYuc2NfcHBjX2FjciA9IDB4NjsKKworCS8qCisJICogU2V0IHVwIG1hc3RlciB3aW5kb3dzIHRoYXQgYWxsb3cgdGhlIENQVSB0byBhY2Nlc3MgUENJIHNwYWNlLiBUaGVzZQorCSAqIHdpbmRvd3MgYXJlIHNldCB1cCB1c2luZyB0aGUgdHdvIFNJVSBQQ0lCUiByZWdpc3RlcnMuCisJICovCisJaW1tYXAtPmltX21lbWN0bC5tZW1jX3BjaW1zazAgPSBQQ0lNU0swX01BU0s7CisJaW1tYXAtPmltX21lbWN0bC5tZW1jX3BjaWJyMCA9IFBDSV9NU1RSMF9MT0NBTCB8IFBDSUJSX0VOQUJMRTsKKworI2lmIGRlZmluZWQgQ09ORklHX01QQzgyNjZBRFMgfHwgZGVmaW5lZCBDT05GSUdfTVBDODI3MgorCWltbWFwLT5pbV9tZW1jdGwubWVtY19wY2ltc2sxID0gUENJTVNLMV9NQVNLOworCWltbWFwLT5pbV9tZW1jdGwubWVtY19wY2licjEgPSBQQ0lfTVNUUjFfTE9DQUwgfCBQQ0lCUl9FTkFCTEU7CisjZW5kaWYKKworCS8qIFJlbGVhc2UgUENJIFJTVCAoYnkgZGVmYXVsdCB0aGUgUENJIFJTVCBzaWduYWwgaXMgaGVsZCBsb3cpCSovCisJaW1tYXAtPmltX3BjaS5wY2lfZ2NyID0gY3B1X3RvX2xlMzIgKFBDSUdDUl9QQ0lfQlVTX0VOKTsKKworCS8qIGdpdmUgaXQgc29tZSB0aW1lICovCisJeworI2lmIGRlZmluZWQgQ09ORklHX01QQzgyNjZBRFMgfHwgZGVmaW5lZCBDT05GSUdfTVBDODI3MgorCQkvKiBHaXZlIHRoZSBQQ0kgY2FyZHMgbW9yZSB0aW1lIHRvIGluaXRpYWxpemUgYmVmb3JlIHF1ZXJ5CisJCSAgIFRoaXMgbWlnaHQgYmUgZ29vZCBmb3Igb3RoZXIgYm9hcmRzIGFsc28KKwkJICovCisJCWludCBpOworCisJCWZvciAoaSA9IDA7IGkgPCAxMDAwOyArK2kpCisjZW5kaWYKKwkJCXVkZWxheSAoMTAwMCk7CisJfQorCisJLyoKKwkgKiBTZXQgdXAgbWFzdGVyIHdpbmRvdyB0aGF0IGFsbG93cyB0aGUgQ1BVIHRvIGFjY2VzcyBQQ0kgTWVtb3J5IChwcmVmZXRjaCkKKwkgKiBzcGFjZS4gVGhpcyB3aW5kb3cgaXMgc2V0IHVwIHVzaW5nIHRoZSBmaXJzdCBzZXQgb2YgT3V0Ym91bmQgQVRVIHJlZ2lzdGVycy4KKwkgKi8KKwlpbW1hcC0+aW1fcGNpLnBjaV9wb3RhcjAgPSBjcHVfdG9fbGUzMiAoUENJX01TVFJfTUVNX0JVUyA+PiAxMik7CS8qIFBDSSBiYXNlICovCisJaW1tYXAtPmltX3BjaS5wY2lfcG9iYXIwID0gY3B1X3RvX2xlMzIgKFBDSV9NU1RSX01FTV9MT0NBTCA+PiAxMik7CS8qIExvY2FsIGJhc2UgKi8KKwlpbW1hcC0+aW1fcGNpLnBjaV9wb2NtcjAgPSBjcHVfdG9fbGUzMiAoUE9DTVIwX01BU0tfQVRUUklCKTsJLyogU2l6ZSAmIGF0dHJpYnV0ZSAqLworCisJLyoKKwkgKiBTZXQgdXAgbWFzdGVyIHdpbmRvdyB0aGF0IGFsbG93cyB0aGUgQ1BVIHRvIGFjY2VzcyBQQ0kgTWVtb3J5IChub24tcHJlZmV0Y2gpCisJICogc3BhY2UuIFRoaXMgd2luZG93IGlzIHNldCB1cCB1c2luZyB0aGUgc2Vjb25kIHNldCBvZiBPdXRib3VuZCBBVFUgcmVnaXN0ZXJzLgorCSAqLworCWltbWFwLT5pbV9wY2kucGNpX3BvdGFyMSA9IGNwdV90b19sZTMyIChQQ0lfTVNUUl9NRU1JT19CVVMgPj4gMTIpOwkvKiBQQ0kgYmFzZSAqLworCWltbWFwLT5pbV9wY2kucGNpX3BvYmFyMSA9IGNwdV90b19sZTMyIChQQ0lfTVNUUl9NRU1JT19MT0NBTCA+PiAxMik7CS8qIExvY2FsIGJhc2UgKi8KKwlpbW1hcC0+aW1fcGNpLnBjaV9wb2NtcjEgPSBjcHVfdG9fbGUzMiAoUE9DTVIxX01BU0tfQVRUUklCKTsJLyogU2l6ZSAmIGF0dHJpYnV0ZSAqLworCisJLyoKKwkgKiBTZXQgdXAgbWFzdGVyIHdpbmRvdyB0aGF0IGFsbG93cyB0aGUgQ1BVIHRvIGFjY2VzcyBQQ0kgSU8gc3BhY2UuIFRoaXMgd2luZG93CisJICogaXMgc2V0IHVwIHVzaW5nIHRoZSB0aGlyZCBzZXQgb2YgT3V0Ym91bmQgQVRVIHJlZ2lzdGVycy4KKwkgKi8KKwlpbW1hcC0+aW1fcGNpLnBjaV9wb3RhcjIgPSBjcHVfdG9fbGUzMiAoUENJX01TVFJfSU9fQlVTID4+IDEyKTsgLyogUENJIGJhc2UgKi8KKwlpbW1hcC0+aW1fcGNpLnBjaV9wb2JhcjIgPSBjcHVfdG9fbGUzMiAoUENJX01TVFJfSU9fTE9DQUwgPj4gMTIpOwkvKiBMb2NhbCBiYXNlICovCisJaW1tYXAtPmltX3BjaS5wY2lfcG9jbXIyID0gY3B1X3RvX2xlMzIgKFBPQ01SMl9NQVNLX0FUVFJJQik7CS8qIFNpemUgJiBhdHRyaWJ1dGUgKi8KKworCS8qCisJICogU2V0IHVwIHNsYXZlIHdpbmRvdyB0aGF0IGFsbG93cyBQQ0kgbWFzdGVycyB0byBhY2Nlc3MgTVBDODI2eCBsb2NhbCBtZW1vcnkuCisJICogVGhpcyB3aW5kb3cgaXMgc2V0IHVwIHVzaW5nIHRoZSBmaXJzdCBzZXQgb2YgSW5ib3VuZCBBVFUgcmVnaXN0ZXJzCisJICovCisJaW1tYXAtPmltX3BjaS5wY2lfcGl0YXIwID0gY3B1X3RvX2xlMzIgKFBDSV9TTFZfTUVNX0xPQ0FMID4+IDEyKTsJLyogUENJIGJhc2UgKi8KKwlpbW1hcC0+aW1fcGNpLnBjaV9waWJhcjAgPSBjcHVfdG9fbGUzMiAoUENJX1NMVl9NRU1fQlVTID4+IDEyKTsgLyogTG9jYWwgYmFzZSAqLworCWltbWFwLT5pbV9wY2kucGNpX3BpY21yMCA9IGNwdV90b19sZTMyIChQSUNNUjBfTUFTS19BVFRSSUIpOwkvKiBTaXplICYgYXR0cmlidXRlICovCisKKwkvKiBTZWUgYWJvdmUgZm9yIGRlc2NyaXB0aW9uIC0gcHV0cyBQQ0kgcmVxdWVzdCBhcyBoaWdoZXN0IHByaW9yaXR5ICovCisjaWZkZWYgQ09ORklHX01QQzgyNzIKKwlpbW1hcC0+aW1fc2l1X2NvbmYuc2NfcHBjX2FscmggPSAweDAxMjM2NzQ1OworI2Vsc2UKKwlpbW1hcC0+aW1fc2l1X2NvbmYuc2NfcHBjX2FscmggPSAweDAzMTI0NTY3OworI2VuZGlmCisKKwkvKiBQYXJrIHRoZSBidXMgb24gdGhlIFBDSSAqLworCWltbWFwLT5pbV9zaXVfY29uZi5zY19wcGNfYWNyID0gUFBDX0FDUl9CVVNfUEFSS19QQ0k7CisKKwkvKiBIb3N0IG1vZGUgLSBzcGVjaWZ5IHRoZSBicmlkZ2UgYXMgYSBob3N0LVBDSSBicmlkZ2UgKi8KKworCXBjaV9ob3NlX3dyaXRlX2NvbmZpZ19ieXRlIChob3NlLCBob3N0X2Rldm5vLCBQQ0lfQ0xBU1NfQ09ERSwKKwkJCQkgICAgUENJX0NMQVNTX0JSSURHRV9DVExSKTsKKworCS8qIEVuYWJsZSB0aGUgaG9zdCBicmlkZ2UgdG8gYmUgYSBtYXN0ZXIgb24gdGhlIFBDSSBidXMsIGFuZCB0byBhY3QgYXMgYSBQQ0kgbWVtb3J5IHRhcmdldCAqLworCXBjaV9ob3NlX3JlYWRfY29uZmlnX3dvcmQgKGhvc2UsIGhvc3RfZGV2bm8sIFBDSV9DT01NQU5ELCAmdGVtcFNob3J0KTsKKwlwY2lfaG9zZV93cml0ZV9jb25maWdfd29yZCAoaG9zZSwgaG9zdF9kZXZubywgUENJX0NPTU1BTkQsCisJCQkJICAgIHRlbXBTaG9ydCB8IFBDSV9DT01NQU5EX01BU1RFUiB8CisJCQkJICAgIFBDSV9DT01NQU5EX01FTU9SWSk7CisKKwkvKiBkbyBzb21lIGJyaWRnZSBpbml0LCBzaG91bGQgYmUgZG9uZSBvbiBhbGwgODI2MCBiYXNlZCBicmlkZ2VzICovCisJcGNpX2hvc2Vfd3JpdGVfY29uZmlnX2J5dGUgKGhvc2UsIGhvc3RfZGV2bm8sIFBDSV9DQUNIRV9MSU5FX1NJWkUsCisJCQkJICAgIDB4MDgpOworCXBjaV9ob3NlX3dyaXRlX2NvbmZpZ19ieXRlIChob3NlLCBob3N0X2Rldm5vLCBQQ0lfTEFURU5DWV9USU1FUiwKKwkJCQkgICAgMHhGOCk7CisKKwlob3NlLT5maXJzdF9idXNubyA9IDA7CisJaG9zZS0+bGFzdF9idXNubyA9IDB4ZmY7CisKKwkvKiBTeXN0ZW0gbWVtb3J5IHNwYWNlICovCisjaWYgZGVmaW5lZCBDT05GSUdfTVBDODI2NkFEUyB8fCBkZWZpbmVkIENPTkZJR19NUEM4MjcyIHx8IGRlZmluZWQgQ09ORklHX1BNODI2CisJcGNpX3NldF9yZWdpb24gKGhvc2UtPnJlZ2lvbnMgKyAwLAorCQkJUENJX1NMVl9NRU1fQlVTLAorCQkJUENJX1NMVl9NRU1fTE9DQUwsCisJCQlnZC0+cmFtX3NpemUsIFBDSV9SRUdJT05fTUVNIHwgUENJX1JFR0lPTl9TWVNfTUVNT1JZKTsKKyNlbHNlCisJcGNpX3NldF9yZWdpb24gKGhvc2UtPnJlZ2lvbnMgKyAwLAorCQkJQ09ORklHX1NZU19TRFJBTV9CQVNFLAorCQkJQ09ORklHX1NZU19TRFJBTV9CQVNFLAorCQkJMHg0MDAwMDAwLCBQQ0lfUkVHSU9OX01FTSB8IFBDSV9SRUdJT05fU1lTX01FTU9SWSk7CisjZW5kaWYKKworCS8qIFBDSSBtZW1vcnkgc3BhY2UgKi8KKyNpZiBkZWZpbmVkIENPTkZJR19NUEM4MjY2QURTIHx8IGRlZmluZWQgQ09ORklHX01QQzgyNzIKKwlwY2lfc2V0X3JlZ2lvbiAoaG9zZS0+cmVnaW9ucyArIDEsCisJCQlQQ0lfTVNUUl9NRU1JT19CVVMsCisJCQlQQ0lfTVNUUl9NRU1JT19MT0NBTCwKKwkJCVBDSV9NU1RSX01FTUlPX1NJWkUsIFBDSV9SRUdJT05fTUVNKTsKKyNlbHNlCisJcGNpX3NldF9yZWdpb24gKGhvc2UtPnJlZ2lvbnMgKyAxLAorCQkJUENJX01TVFJfTUVNX0JVUywKKwkJCVBDSV9NU1RSX01FTV9MT0NBTCwKKwkJCVBDSV9NU1RSX01FTV9TSVpFLCBQQ0lfUkVHSU9OX01FTSk7CisjZW5kaWYKKworCS8qIFBDSSBJL08gc3BhY2UgKi8KKwlwY2lfc2V0X3JlZ2lvbiAoaG9zZS0+cmVnaW9ucyArIDIsCisJCQlQQ0lfTVNUUl9JT19CVVMsCisJCQlQQ0lfTVNUUl9JT19MT0NBTCwgUENJX01TVFJfSU9fU0laRSwgUENJX1JFR0lPTl9JTyk7CisKKwlob3NlLT5yZWdpb25fY291bnQgPSAzOworCisJcGNpX3JlZ2lzdGVyX2hvc2UgKGhvc2UpOworCS8qIE1hc2sgb2ZmIG1hc3RlciBhYm9ydCBtYWNoaW5lIGNoZWNrcyAqLworCWltbWFwLT5pbV9wY2kucGNpX2VtciAmPSBjcHVfdG9fbGUzMiAoflBDSV9FUlJPUl9QQ0lfTk9fUlNQKTsKKwllaWVpbyAoKTsKKworCWhvc2UtPmxhc3RfYnVzbm8gPSBwY2lfaG9zZV9zY2FuIChob3NlKTsKKworCisJLyogY2xlYXIgdGhlIGVycm9yIGluIHRoZSBlcnJvciBzdGF0dXMgcmVnaXN0ZXIgKi8KKwlpbW1hcC0+aW1fcGNpLnBjaV9lc3IgPSBjcHVfdG9fbGUzMiAoUENJX0VSUk9SX1BDSV9OT19SU1ApOworCisJLyogdW5tYXNrIG1hc3RlciBhYm9ydCBtYWNoaW5lIGNoZWNrcyAqLworCWltbWFwLT5pbV9wY2kucGNpX2VtciB8PSBjcHVfdG9fbGUzMiAoUENJX0VSUk9SX1BDSV9OT19SU1ApOworfQorCisjaWYgZGVmaW5lZChDT05GSUdfT0ZfTElCRkRUKQordm9pZCBmdF9wY2lfc2V0dXAodm9pZCAqYmxvYiwgYmRfdCAqYmQpCit7CisJZG9fZml4dXBfYnlfcHJvcF91MzIoYmxvYiwgImRldmljZV90eXBlIiwgInBjaSIsIDQsCisJCSJjbG9jay1mcmVxdWVuY3kiLCBnZC0+cGNpX2NsaywgMSk7Cit9CisjZW5kaWYKKworI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI2MC9zZXJpYWxfc2NjLmMgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgyNjAvc2VyaWFsX3NjYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhYjZhMjgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgyNjAvc2VyaWFsX3NjYy5jCkBAIC0wLDAgKzEsNDk4IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAwCisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqIEhhY2tlZCBmb3IgTVBDODI2MCBieSBNdXJyYXkuSmVuc2VuQGNtc3QuY3Npcm8uYXUsIDE5LU9jdC0wMC4KKyAqLworCisvKgorICogTWluaW1hbCBzZXJpYWwgZnVuY3Rpb25zIG5lZWRlZCB0byB1c2Ugb25lIG9mIHRoZSBTQ0MgcG9ydHMKKyAqIGFzIHNlcmlhbCBjb25zb2xlIGludGVyZmFjZS4KKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8bXBjODI2MC5oPgorI2luY2x1ZGUgPGFzbS9jcG1fODI2MC5oPgorCitERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworI2lmIGRlZmluZWQoQ09ORklHX0NPTlNfT05fU0NDKQorCisjaWYgQ09ORklHX0NPTlNfSU5ERVggPT0gMQkvKiBDb25zb2xlIG9uIFNDQzEgKi8KKworI2RlZmluZSBTQ0NfSU5ERVgJCTAKKyNkZWZpbmUgUFJPRkZfU0NDCQlQUk9GRl9TQ0MxCisjZGVmaW5lIENNWFNDUl9NQVNLCQkoQ01YU0NSX0dSMXxDTVhTQ1JfU0MxfFwKKwkJCQkJQ01YU0NSX1JTMUNTX01TS3xDTVhTQ1JfVFMxQ1NfTVNLKQorI2RlZmluZSBDTVhTQ1JfVkFMVUUJCShDTVhTQ1JfUlMxQ1NfQlJHMXxDTVhTQ1JfVFMxQ1NfQlJHMSkKKyNkZWZpbmUgQ1BNX0NSX1NDQ19QQUdFCQlDUE1fQ1JfU0NDMV9QQUdFCisjZGVmaW5lIENQTV9DUl9TQ0NfU0JMT0NLCUNQTV9DUl9TQ0MxX1NCTE9DSworCisjZWxpZiBDT05GSUdfQ09OU19JTkRFWCA9PSAyCS8qIENvbnNvbGUgb24gU0NDMiAqLworCisjZGVmaW5lIFNDQ19JTkRFWAkJMQorI2RlZmluZSBQUk9GRl9TQ0MJCVBST0ZGX1NDQzIKKyNkZWZpbmUgQ01YU0NSX01BU0sJCShDTVhTQ1JfR1IyfENNWFNDUl9TQzJ8XAorCQkJCQlDTVhTQ1JfUlMyQ1NfTVNLfENNWFNDUl9UUzJDU19NU0spCisjZGVmaW5lIENNWFNDUl9WQUxVRQkJKENNWFNDUl9SUzJDU19CUkcyfENNWFNDUl9UUzJDU19CUkcyKQorI2RlZmluZSBDUE1fQ1JfU0NDX1BBR0UJCUNQTV9DUl9TQ0MyX1BBR0UKKyNkZWZpbmUgQ1BNX0NSX1NDQ19TQkxPQ0sJQ1BNX0NSX1NDQzJfU0JMT0NLCisKKyNlbGlmIENPTkZJR19DT05TX0lOREVYID09IDMJLyogQ29uc29sZSBvbiBTQ0MzICovCisKKyNkZWZpbmUgU0NDX0lOREVYCQkyCisjZGVmaW5lIFBST0ZGX1NDQwkJUFJPRkZfU0NDMworI2RlZmluZSBDTVhTQ1JfTUFTSwkJKENNWFNDUl9HUjN8Q01YU0NSX1NDM3xcCisJCQkJCUNNWFNDUl9SUzNDU19NU0t8Q01YU0NSX1RTM0NTX01TSykKKyNkZWZpbmUgQ01YU0NSX1ZBTFVFCQkoQ01YU0NSX1JTM0NTX0JSRzN8Q01YU0NSX1RTM0NTX0JSRzMpCisjZGVmaW5lIENQTV9DUl9TQ0NfUEFHRQkJQ1BNX0NSX1NDQzNfUEFHRQorI2RlZmluZSBDUE1fQ1JfU0NDX1NCTE9DSwlDUE1fQ1JfU0NDM19TQkxPQ0sKKworI2VsaWYgQ09ORklHX0NPTlNfSU5ERVggPT0gNAkvKiBDb25zb2xlIG9uIFNDQzQgKi8KKworI2RlZmluZSBTQ0NfSU5ERVgJCTMKKyNkZWZpbmUgUFJPRkZfU0NDCQlQUk9GRl9TQ0M0CisjZGVmaW5lIENNWFNDUl9NQVNLCQkoQ01YU0NSX0dSNHxDTVhTQ1JfU0M0fFwKKwkJCQkJQ01YU0NSX1JTNENTX01TS3xDTVhTQ1JfVFM0Q1NfTVNLKQorI2RlZmluZSBDTVhTQ1JfVkFMVUUJCShDTVhTQ1JfUlM0Q1NfQlJHNHxDTVhTQ1JfVFM0Q1NfQlJHNCkKKyNkZWZpbmUgQ1BNX0NSX1NDQ19QQUdFCQlDUE1fQ1JfU0NDNF9QQUdFCisjZGVmaW5lIENQTV9DUl9TQ0NfU0JMT0NLCUNQTV9DUl9TQ0M0X1NCTE9DSworCisjZWxzZQorCisjZXJyb3IgImNvbnNvbGUgbm90IGNvcnJlY3RseSBkZWZpbmVkIgorCisjZW5kaWYKKworaW50IHNlcmlhbF9pbml0ICh2b2lkKQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltID0gKGltbWFwX3QgKilDT05GSUdfU1lTX0lNTVI7CisJdm9sYXRpbGUgc2NjX3QgKnNwOworCXZvbGF0aWxlIHNjY191YXJ0X3QgKnVwOworCXZvbGF0aWxlIGNiZF90ICp0YmRmLCAqcmJkZjsKKwl2b2xhdGlsZSBjcG04MjYwX3QgKmNwID0gJihpbS0+aW1fY3BtKTsKKwl1aW50CWRwYWRkcjsKKworCS8qIGluaXRpYWxpemUgcG9pbnRlcnMgdG8gU0NDICovCisKKwlzcCA9IChzY2NfdCAqKSAmKGltLT5pbV9zY2NbU0NDX0lOREVYXSk7CisJdXAgPSAoc2NjX3VhcnRfdCAqKSZpbS0+aW1fZHByYW1iYXNlW1BST0ZGX1NDQ107CisKKwkvKiBEaXNhYmxlIHRyYW5zbWl0dGVyL3JlY2VpdmVyLgorCSovCisJc3AtPnNjY19nc21ybCAmPSB+KFNDQ19HU01STF9FTlIgfCBTQ0NfR1NNUkxfRU5UKTsKKworCS8qIHB1dCB0aGUgU0NDIGNoYW5uZWwgaW50byBOTVNJIChub24gbXVsdGlwbGV4ZCBzZXJpYWwgaW50ZXJmYWNlKQorCSAqIG1vZGUgYW5kIHdpcmUgdGhlIHNlbGVjdGVkIFNDQyBUeCBhbmQgUnggY2xvY2tzIHRvIEJSR3ggKDE1LTE1KS4KKwkgKi8KKwlpbS0+aW1fY3BtdXguY214X3NjciA9IChpbS0+aW1fY3BtdXguY214X3NjciZ+Q01YU0NSX01BU0spfENNWFNDUl9WQUxVRTsKKworCS8qIFNldCB1cCB0aGUgYmF1ZCByYXRlIGdlbmVyYXRvci4KKwkqLworCXNlcmlhbF9zZXRicmcgKCk7CisKKwkvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdHdvIGJ1ZmZlciBkZXNjcmlwdG9ycyBpbiB0aGUgRFAgcmFtLgorCSAqIGRhbW06IGFsbG9jYXRpbmcgc3BhY2UgYWZ0ZXIgdGhlIHR3byBidWZmZXJzIGZvciByeC90eCBkYXRhCisJICovCisKKwlkcGFkZHIgPSBtODI2MF9jcG1fZHBhbGxvYygoMiAqIHNpemVvZiAoY2JkX3QpKSArIDIsIDE2KTsKKworCS8qIFNldCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgaG9zdCBtZW1vcnkgYnVmZmVycyBpbgorCSAqIHRoZSBidWZmZXIgZGVzY3JpcHRvcnMuCisJICovCisJcmJkZiA9IChjYmRfdCAqKSZpbS0+aW1fZHByYW1iYXNlW2RwYWRkcl07CisJcmJkZi0+Y2JkX2J1ZmFkZHIgPSAodWludCkgKHJiZGYrMik7CisJcmJkZi0+Y2JkX3NjID0gQkRfU0NfRU1QVFkgfCBCRF9TQ19XUkFQOworCXRiZGYgPSByYmRmICsgMTsKKwl0YmRmLT5jYmRfYnVmYWRkciA9ICgodWludCkgKHJiZGYrMikpICsgMTsKKwl0YmRmLT5jYmRfc2MgPSBCRF9TQ19XUkFQOworCisJLyogU2V0IHVwIHRoZSB1YXJ0IHBhcmFtZXRlcnMgaW4gdGhlIHBhcmFtZXRlciByYW0uCisJKi8KKwl1cC0+c2NjX2dlbnNjYy5zY2NfcmJhc2UgPSBkcGFkZHI7CisJdXAtPnNjY19nZW5zY2Muc2NjX3RiYXNlID0gZHBhZGRyK3NpemVvZihjYmRfdCk7CisJdXAtPnNjY19nZW5zY2Muc2NjX3JmY3IgPSBDUE1GQ1JfRUI7CisJdXAtPnNjY19nZW5zY2Muc2NjX3RmY3IgPSBDUE1GQ1JfRUI7CisJdXAtPnNjY19nZW5zY2Muc2NjX21yYmxyID0gMTsKKwl1cC0+c2NjX21heGlkbCA9IDA7CisJdXAtPnNjY19icmtjciA9IDE7CisJdXAtPnNjY19wYXJlYyA9IDA7CisJdXAtPnNjY19mcm1lYyA9IDA7CisJdXAtPnNjY19ub3NlYyA9IDA7CisJdXAtPnNjY19icmtlYyA9IDA7CisJdXAtPnNjY191YWRkcjEgPSAwOworCXVwLT5zY2NfdWFkZHIyID0gMDsKKwl1cC0+c2NjX3Rvc2VxID0gMDsKKwl1cC0+c2NjX2NoYXIxID0gdXAtPnNjY19jaGFyMiA9IHVwLT5zY2NfY2hhcjMgPSB1cC0+c2NjX2NoYXI0ID0gMHg4MDAwOworCXVwLT5zY2NfY2hhcjUgPSB1cC0+c2NjX2NoYXI2ID0gdXAtPnNjY19jaGFyNyA9IHVwLT5zY2NfY2hhcjggPSAweDgwMDA7CisJdXAtPnNjY19yY2NtID0gMHhjMGZmOworCisJLyogTWFzayBhbGwgaW50ZXJydXB0cyBhbmQgcmVtb3ZlIGFueXRoaW5nIHBlbmRpbmcuCisJKi8KKwlzcC0+c2NjX3NjY20gPSAwOworCXNwLT5zY2Nfc2NjZSA9IDB4ZmZmZjsKKworCS8qIFNldCA4IGJpdCBGSUZPLCAxNiBiaXQgb3ZlcnNhbXBsaW5nIGFuZCBVQVJUIG1vZGUuCisJKi8KKwlzcC0+c2NjX2dzbXJoID0gU0NDX0dTTVJIX1JGVzsJLyogOCBiaXQgRklGTyAqLworCXNwLT5zY2NfZ3NtcmwgPSBcCisJCVNDQ19HU01STF9URENSXzE2IHwgU0NDX0dTTVJMX1JEQ1JfMTYgfCBTQ0NfR1NNUkxfTU9ERV9VQVJUOworCisJLyogU2V0IENUUyBmbG93IGNvbnRyb2wsIDEgc3RvcCBiaXQsIDggYml0IGNoYXJhY3RlciBsZW5ndGgsCisJICogbm9ybWFsIGFzeW5jIFVBUlQgbW9kZSwgbm8gcGFyaXR5CisJICovCisJc3AtPnNjY19wc21yID0gU0NVX1BTTVJfRkxDIHwgU0NVX1BTTVJfQ0w7CisKKwkvKiBleGVjdXRlIHRoZSAiSW5pdCBSeCBhbmQgVHggcGFyYW1zIiBDUCBjb21tYW5kLgorCSovCisKKwl3aGlsZSAoY3AtPmNwX2NwY3IgJiBDUE1fQ1JfRkxHKSAgLyogd2FpdCBpZiBjcCBpcyBidXN5ICovCisJICA7CisKKwljcC0+Y3BfY3BjciA9IG1rX2NyX2NtZChDUE1fQ1JfU0NDX1BBR0UsIENQTV9DUl9TQ0NfU0JMT0NLLAorCQkJCQkwLCBDUE1fQ1JfSU5JVF9UUlgpIHwgQ1BNX0NSX0ZMRzsKKworCXdoaWxlIChjcC0+Y3BfY3BjciAmIENQTV9DUl9GTEcpICAvKiB3YWl0IGlmIGNwIGlzIGJ1c3kgKi8KKwkgIDsKKworCS8qIEVuYWJsZSB0cmFuc21pdHRlci9yZWNlaXZlci4KKwkqLworCXNwLT5zY2NfZ3NtcmwgfD0gU0NDX0dTTVJMX0VOUiB8IFNDQ19HU01STF9FTlQ7CisKKwlyZXR1cm4gKDApOworfQorCit2b2lkCitzZXJpYWxfc2V0YnJnICh2b2lkKQoreworI2lmIGRlZmluZWQoQ09ORklHX0NPTlNfVVNFX0VYVEMpCisJbTgyNjBfY3BtX2V4dGNicmcoU0NDX0lOREVYLCBnZC0+YmF1ZHJhdGUsCisJCUNPTkZJR19DT05TX0VYVENfUkFURSwgQ09ORklHX0NPTlNfRVhUQ19QSU5TRUwpOworI2Vsc2UKKwltODI2MF9jcG1fc2V0YnJnKFNDQ19JTkRFWCwgZ2QtPmJhdWRyYXRlKTsKKyNlbmRpZgorfQorCit2b2lkCitzZXJpYWxfcHV0Yyhjb25zdCBjaGFyIGMpCit7CisJdm9sYXRpbGUgc2NjX3VhcnRfdAkqdXA7CisJdm9sYXRpbGUgY2JkX3QJCSp0YmRmOworCXZvbGF0aWxlIGltbWFwX3QJKmltOworCisJaWYgKGMgPT0gJ1xuJykKKwkJc2VyaWFsX3B1dGMgKCdccicpOworCisJaW0gPSAoaW1tYXBfdCAqKUNPTkZJR19TWVNfSU1NUjsKKwl1cCA9IChzY2NfdWFydF90ICopJmltLT5pbV9kcHJhbWJhc2VbUFJPRkZfU0NDXTsKKwl0YmRmID0gKGNiZF90ICopJmltLT5pbV9kcHJhbWJhc2VbdXAtPnNjY19nZW5zY2Muc2NjX3RiYXNlXTsKKworCS8qIFdhaXQgZm9yIGxhc3QgY2hhcmFjdGVyIHRvIGdvLgorCSAqLworCXdoaWxlICh0YmRmLT5jYmRfc2MgJiBCRF9TQ19SRUFEWSkKKwkJOworCisJLyogTG9hZCB0aGUgY2hhcmFjdGVyIGludG8gdGhlIHRyYW5zbWl0IGJ1ZmZlci4KKwkgKi8KKwkqKHZvbGF0aWxlIGNoYXIgKil0YmRmLT5jYmRfYnVmYWRkciA9IGM7CisJdGJkZi0+Y2JkX2RhdGxlbiA9IDE7CisJdGJkZi0+Y2JkX3NjIHw9IEJEX1NDX1JFQURZOworfQorCit2b2lkCitzZXJpYWxfcHV0cyAoY29uc3QgY2hhciAqcykKK3sKKwl3aGlsZSAoKnMpIHsKKwkJc2VyaWFsX3B1dGMgKCpzKyspOworCX0KK30KKworaW50CitzZXJpYWxfZ2V0Yyh2b2lkKQoreworCXZvbGF0aWxlIGNiZF90CQkqcmJkZjsKKwl2b2xhdGlsZSBzY2NfdWFydF90CSp1cDsKKwl2b2xhdGlsZSBpbW1hcF90CSppbTsKKwl1bnNpZ25lZCBjaGFyCQljOworCisJaW0gPSAoaW1tYXBfdCAqKUNPTkZJR19TWVNfSU1NUjsKKwl1cCA9IChzY2NfdWFydF90ICopJmltLT5pbV9kcHJhbWJhc2VbUFJPRkZfU0NDXTsKKwlyYmRmID0gKGNiZF90ICopJmltLT5pbV9kcHJhbWJhc2VbdXAtPnNjY19nZW5zY2Muc2NjX3JiYXNlXTsKKworCS8qIFdhaXQgZm9yIGNoYXJhY3RlciB0byBzaG93IHVwLgorCSAqLworCXdoaWxlIChyYmRmLT5jYmRfc2MgJiBCRF9TQ19FTVBUWSkKKwkJOworCisJLyogR3JhYiB0aGUgY2hhciBhbmQgY2xlYXIgdGhlIGJ1ZmZlciBhZ2Fpbi4KKwkgKi8KKwljID0gKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopcmJkZi0+Y2JkX2J1ZmFkZHI7CisJcmJkZi0+Y2JkX3NjIHw9IEJEX1NDX0VNUFRZOworCisJcmV0dXJuIChjKTsKK30KKworaW50CitzZXJpYWxfdHN0YygpCit7CisJdm9sYXRpbGUgY2JkX3QJCSpyYmRmOworCXZvbGF0aWxlIHNjY191YXJ0X3QJKnVwOworCXZvbGF0aWxlIGltbWFwX3QJKmltOworCisJaW0gPSAoaW1tYXBfdCAqKUNPTkZJR19TWVNfSU1NUjsKKwl1cCA9IChzY2NfdWFydF90ICopJmltLT5pbV9kcHJhbWJhc2VbUFJPRkZfU0NDXTsKKwlyYmRmID0gKGNiZF90ICopJmltLT5pbV9kcHJhbWJhc2VbdXAtPnNjY19nZW5zY2Muc2NjX3JiYXNlXTsKKworCXJldHVybiAoKHJiZGYtPmNiZF9zYyAmIEJEX1NDX0VNUFRZKSA9PSAwKTsKK30KKworI2VuZGlmCS8qIENPTkZJR19DT05TX09OX1NDQyAqLworCisjaWYgZGVmaW5lZChDT05GSUdfS0dEQl9PTl9TQ0MpCisKKyNpZiBkZWZpbmVkKENPTkZJR19DT05TX09OX1NDQykgJiYgQ09ORklHX0tHREJfSU5ERVggPT0gQ09ORklHX0NPTlNfSU5ERVgKKyNlcnJvciBXaG9vcHMhIHNlcmlhbCBjb25zb2xlIGFuZCBrZ2RiIGFyZSBvbiB0aGUgc2FtZSBzY2Mgc2VyaWFsIHBvcnQKKyNlbmRpZgorCisjaWYgQ09ORklHX0tHREJfSU5ERVggPT0gMQkvKiBLR0RCIFBvcnQgb24gU0NDMSAqLworCisjZGVmaW5lIEtHREJfU0NDX0lOREVYCQkwCisjZGVmaW5lIEtHREJfUFJPRkZfU0NDCQlQUk9GRl9TQ0MxCisjZGVmaW5lIEtHREJfQ01YU0NSX01BU0sJKENNWFNDUl9HUjF8Q01YU0NSX1NDMXxcCisJCQkJCUNNWFNDUl9SUzFDU19NU0t8Q01YU0NSX1RTMUNTX01TSykKKyNkZWZpbmUgS0dEQl9DTVhTQ1JfVkFMVUUJKENNWFNDUl9SUzFDU19CUkcxfENNWFNDUl9UUzFDU19CUkcxKQorI2RlZmluZSBLR0RCX0NQTV9DUl9TQ0NfUEFHRQlDUE1fQ1JfU0NDMV9QQUdFCisjZGVmaW5lIEtHREJfQ1BNX0NSX1NDQ19TQkxPQ0sJQ1BNX0NSX1NDQzFfU0JMT0NLCisKKyNlbGlmIENPTkZJR19LR0RCX0lOREVYID09IDIJLyogS0dEQiBQb3J0IG9uIFNDQzIgKi8KKworI2RlZmluZSBLR0RCX1NDQ19JTkRFWAkJMQorI2RlZmluZSBLR0RCX1BST0ZGX1NDQwkJUFJPRkZfU0NDMgorI2RlZmluZSBLR0RCX0NNWFNDUl9NQVNLCShDTVhTQ1JfR1IyfENNWFNDUl9TQzJ8XAorCQkJCQlDTVhTQ1JfUlMyQ1NfTVNLfENNWFNDUl9UUzJDU19NU0spCisjZGVmaW5lIEtHREJfQ01YU0NSX1ZBTFVFCShDTVhTQ1JfUlMyQ1NfQlJHMnxDTVhTQ1JfVFMyQ1NfQlJHMikKKyNkZWZpbmUgS0dEQl9DUE1fQ1JfU0NDX1BBR0UJQ1BNX0NSX1NDQzJfUEFHRQorI2RlZmluZSBLR0RCX0NQTV9DUl9TQ0NfU0JMT0NLCUNQTV9DUl9TQ0MyX1NCTE9DSworCisjZWxpZiBDT05GSUdfS0dEQl9JTkRFWCA9PSAzCS8qIEtHREIgUG9ydCBvbiBTQ0MzICovCisKKyNkZWZpbmUgS0dEQl9TQ0NfSU5ERVgJCTIKKyNkZWZpbmUgS0dEQl9QUk9GRl9TQ0MJCVBST0ZGX1NDQzMKKyNkZWZpbmUgS0dEQl9DTVhTQ1JfTUFTSwkoQ01YU0NSX0dSM3xDTVhTQ1JfU0MzfFwKKwkJCQkJQ01YU0NSX1JTM0NTX01TS3xDTVhTQ1JfVFMzQ1NfTVNLKQorI2RlZmluZSBLR0RCX0NNWFNDUl9WQUxVRQkoQ01YU0NSX1JTM0NTX0JSRzN8Q01YU0NSX1RTM0NTX0JSRzMpCisjZGVmaW5lIEtHREJfQ1BNX0NSX1NDQ19QQUdFCUNQTV9DUl9TQ0MzX1BBR0UKKyNkZWZpbmUgS0dEQl9DUE1fQ1JfU0NDX1NCTE9DSwlDUE1fQ1JfU0NDM19TQkxPQ0sKKworI2VsaWYgQ09ORklHX0tHREJfSU5ERVggPT0gNAkvKiBLR0RCIFBvcnQgb24gU0NDNCAqLworCisjZGVmaW5lIEtHREJfU0NDX0lOREVYCQkzCisjZGVmaW5lIEtHREJfUFJPRkZfU0NDCQlQUk9GRl9TQ0M0CisjZGVmaW5lIEtHREJfQ01YU0NSX01BU0sJKENNWFNDUl9HUjR8Q01YU0NSX1NDNHxcCisJCQkJCUNNWFNDUl9SUzRDU19NU0t8Q01YU0NSX1RTNENTX01TSykKKyNkZWZpbmUgS0dEQl9DTVhTQ1JfVkFMVUUJKENNWFNDUl9SUzRDU19CUkc0fENNWFNDUl9UUzRDU19CUkc0KQorI2RlZmluZSBLR0RCX0NQTV9DUl9TQ0NfUEFHRQlDUE1fQ1JfU0NDNF9QQUdFCisjZGVmaW5lIEtHREJfQ1BNX0NSX1NDQ19TQkxPQ0sJQ1BNX0NSX1NDQzRfU0JMT0NLCisKKyNlbHNlCisKKyNlcnJvciAia2dkYiBzZXJpYWwgcG9ydCBub3QgY29ycmVjdGx5IGRlZmluZWQiCisKKyNlbmRpZgorCit2b2lkCitrZ2RiX3NlcmlhbF9pbml0ICh2b2lkKQoreworCXZvbGF0aWxlIGltbWFwX3QgKmltID0gKGltbWFwX3QgKilDT05GSUdfU1lTX0lNTVI7CisJdm9sYXRpbGUgc2NjX3QgKnNwOworCXZvbGF0aWxlIHNjY191YXJ0X3QgKnVwOworCXZvbGF0aWxlIGNiZF90ICp0YmRmLCAqcmJkZjsKKwl2b2xhdGlsZSBjcG04MjYwX3QgKmNwID0gJihpbS0+aW1fY3BtKTsKKwl1aW50IGRwYWRkciwgc3BlZWQgPSBDT05GSUdfS0dEQl9CQVVEUkFURTsKKwljaGFyICpzLCAqZTsKKworCWlmICgocyA9IGdldGVudigia2dkYnJhdGUiKSkgIT0gTlVMTCAmJiAqcyAhPSAnXDAnKSB7CisJCXVsb25nIHJhdGUgPSBzaW1wbGVfc3RydG91bChzLCAmZSwgMTApOworCQlpZiAoZSA+IHMgJiYgKmUgPT0gJ1wwJykKKwkJCXNwZWVkID0gcmF0ZTsKKwl9CisKKwkvKiBpbml0aWFsaXplIHBvaW50ZXJzIHRvIFNDQyAqLworCisJc3AgPSAoc2NjX3QgKikgJihpbS0+aW1fc2NjW0tHREJfU0NDX0lOREVYXSk7CisJdXAgPSAoc2NjX3VhcnRfdCAqKSZpbS0+aW1fZHByYW1iYXNlW0tHREJfUFJPRkZfU0NDXTsKKworCS8qIERpc2FibGUgdHJhbnNtaXR0ZXIvcmVjZWl2ZXIuCisJKi8KKwlzcC0+c2NjX2dzbXJsICY9IH4oU0NDX0dTTVJMX0VOUiB8IFNDQ19HU01STF9FTlQpOworCisJLyogcHV0IHRoZSBTQ0MgY2hhbm5lbCBpbnRvIE5NU0kgKG5vbiBtdWx0aXBsZXhkIHNlcmlhbCBpbnRlcmZhY2UpCisJICogbW9kZSBhbmQgd2lyZSB0aGUgc2VsZWN0ZWQgU0NDIFR4IGFuZCBSeCBjbG9ja3MgdG8gQlJHeCAoMTUtMTUpLgorCSAqLworCWltLT5pbV9jcG11eC5jbXhfc2NyID0gXAorCQkoaW0tPmltX2NwbXV4LmNteF9zY3IgJiB+S0dEQl9DTVhTQ1JfTUFTSykgfCBLR0RCX0NNWFNDUl9WQUxVRTsKKworCS8qIFNldCB1cCB0aGUgYmF1ZCByYXRlIGdlbmVyYXRvci4KKwkqLworI2lmIGRlZmluZWQoQ09ORklHX0tHREJfVVNFX0VYVEMpCisJbTgyNjBfY3BtX2V4dGNicmcoS0dEQl9TQ0NfSU5ERVgsIHNwZWVkLAorCQlDT05GSUdfS0dEQl9FWFRDX1JBVEUsIENPTkZJR19LR0RCX0VYVENfUElOU0VMKTsKKyNlbHNlCisJbTgyNjBfY3BtX3NldGJyZyhLR0RCX1NDQ19JTkRFWCwgc3BlZWQpOworI2VuZGlmCisKKwkvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdHdvIGJ1ZmZlciBkZXNjcmlwdG9ycyBpbiB0aGUgRFAgcmFtLgorCSAqIGRhbW06IGFsbG9jYXRpbmcgc3BhY2UgYWZ0ZXIgdGhlIHR3byBidWZmZXJzIGZvciByeC90eCBkYXRhCisJICovCisKKwlkcGFkZHIgPSBtODI2MF9jcG1fZHBhbGxvYygoMiAqIHNpemVvZiAoY2JkX3QpKSArIDIsIDE2KTsKKworCS8qIFNldCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgaG9zdCBtZW1vcnkgYnVmZmVycyBpbgorCSAqIHRoZSBidWZmZXIgZGVzY3JpcHRvcnMuCisJICovCisJcmJkZiA9IChjYmRfdCAqKSZpbS0+aW1fZHByYW1iYXNlW2RwYWRkcl07CisJcmJkZi0+Y2JkX2J1ZmFkZHIgPSAodWludCkgKHJiZGYrMik7CisJcmJkZi0+Y2JkX3NjID0gQkRfU0NfRU1QVFkgfCBCRF9TQ19XUkFQOworCXRiZGYgPSByYmRmICsgMTsKKwl0YmRmLT5jYmRfYnVmYWRkciA9ICgodWludCkgKHJiZGYrMikpICsgMTsKKwl0YmRmLT5jYmRfc2MgPSBCRF9TQ19XUkFQOworCisJLyogU2V0IHVwIHRoZSB1YXJ0IHBhcmFtZXRlcnMgaW4gdGhlIHBhcmFtZXRlciByYW0uCisJKi8KKwl1cC0+c2NjX2dlbnNjYy5zY2NfcmJhc2UgPSBkcGFkZHI7CisJdXAtPnNjY19nZW5zY2Muc2NjX3RiYXNlID0gZHBhZGRyK3NpemVvZihjYmRfdCk7CisJdXAtPnNjY19nZW5zY2Muc2NjX3JmY3IgPSBDUE1GQ1JfRUI7CisJdXAtPnNjY19nZW5zY2Muc2NjX3RmY3IgPSBDUE1GQ1JfRUI7CisJdXAtPnNjY19nZW5zY2Muc2NjX21yYmxyID0gMTsKKwl1cC0+c2NjX21heGlkbCA9IDA7CisJdXAtPnNjY19icmtjciA9IDE7CisJdXAtPnNjY19wYXJlYyA9IDA7CisJdXAtPnNjY19mcm1lYyA9IDA7CisJdXAtPnNjY19ub3NlYyA9IDA7CisJdXAtPnNjY19icmtlYyA9IDA7CisJdXAtPnNjY191YWRkcjEgPSAwOworCXVwLT5zY2NfdWFkZHIyID0gMDsKKwl1cC0+c2NjX3Rvc2VxID0gMDsKKwl1cC0+c2NjX2NoYXIxID0gdXAtPnNjY19jaGFyMiA9IHVwLT5zY2NfY2hhcjMgPSB1cC0+c2NjX2NoYXI0ID0gMHg4MDAwOworCXVwLT5zY2NfY2hhcjUgPSB1cC0+c2NjX2NoYXI2ID0gdXAtPnNjY19jaGFyNyA9IHVwLT5zY2NfY2hhcjggPSAweDgwMDA7CisJdXAtPnNjY19yY2NtID0gMHhjMGZmOworCisJLyogTWFzayBhbGwgaW50ZXJydXB0cyBhbmQgcmVtb3ZlIGFueXRoaW5nIHBlbmRpbmcuCisJKi8KKwlzcC0+c2NjX3NjY20gPSAwOworCXNwLT5zY2Nfc2NjZSA9IDB4ZmZmZjsKKworCS8qIFNldCA4IGJpdCBGSUZPLCAxNiBiaXQgb3ZlcnNhbXBsaW5nIGFuZCBVQVJUIG1vZGUuCisJKi8KKwlzcC0+c2NjX2dzbXJoID0gU0NDX0dTTVJIX1JGVzsJLyogOCBiaXQgRklGTyAqLworCXNwLT5zY2NfZ3NtcmwgPSBcCisJCVNDQ19HU01STF9URENSXzE2IHwgU0NDX0dTTVJMX1JEQ1JfMTYgfCBTQ0NfR1NNUkxfTU9ERV9VQVJUOworCisJLyogU2V0IENUUyBmbG93IGNvbnRyb2wsIDEgc3RvcCBiaXQsIDggYml0IGNoYXJhY3RlciBsZW5ndGgsCisJICogbm9ybWFsIGFzeW5jIFVBUlQgbW9kZSwgbm8gcGFyaXR5CisJICovCisJc3AtPnNjY19wc21yID0gU0NVX1BTTVJfRkxDIHwgU0NVX1BTTVJfQ0w7CisKKwkvKiBleGVjdXRlIHRoZSAiSW5pdCBSeCBhbmQgVHggcGFyYW1zIiBDUCBjb21tYW5kLgorCSovCisKKwl3aGlsZSAoY3AtPmNwX2NwY3IgJiBDUE1fQ1JfRkxHKSAgLyogd2FpdCBpZiBjcCBpcyBidXN5ICovCisJICA7CisKKwljcC0+Y3BfY3BjciA9IG1rX2NyX2NtZChLR0RCX0NQTV9DUl9TQ0NfUEFHRSwgS0dEQl9DUE1fQ1JfU0NDX1NCTE9DSywKKwkJCQkJMCwgQ1BNX0NSX0lOSVRfVFJYKSB8IENQTV9DUl9GTEc7CisKKwl3aGlsZSAoY3AtPmNwX2NwY3IgJiBDUE1fQ1JfRkxHKSAgLyogd2FpdCBpZiBjcCBpcyBidXN5ICovCisJICA7CisKKwkvKiBFbmFibGUgdHJhbnNtaXR0ZXIvcmVjZWl2ZXIuCisJKi8KKwlzcC0+c2NjX2dzbXJsIHw9IFNDQ19HU01STF9FTlIgfCBTQ0NfR1NNUkxfRU5UOworCisJcHJpbnRmKCJTQ0MlZCBhdCAlZGJwcyAiLCBDT05GSUdfS0dEQl9JTkRFWCwgc3BlZWQpOworfQorCit2b2lkCitwdXREZWJ1Z0NoYXIoY29uc3QgY2hhciBjKQoreworCXZvbGF0aWxlIHNjY191YXJ0X3QJKnVwOworCXZvbGF0aWxlIGNiZF90CQkqdGJkZjsKKwl2b2xhdGlsZSBpbW1hcF90CSppbTsKKworCWlmIChjID09ICdcbicpCisJCXB1dERlYnVnQ2hhciAoJ1xyJyk7CisKKwlpbSA9IChpbW1hcF90ICopQ09ORklHX1NZU19JTU1SOworCXVwID0gKHNjY191YXJ0X3QgKikmaW0tPmltX2RwcmFtYmFzZVtLR0RCX1BST0ZGX1NDQ107CisJdGJkZiA9IChjYmRfdCAqKSZpbS0+aW1fZHByYW1iYXNlW3VwLT5zY2NfZ2Vuc2NjLnNjY190YmFzZV07CisKKwkvKiBXYWl0IGZvciBsYXN0IGNoYXJhY3RlciB0byBnby4KKwkgKi8KKwl3aGlsZSAodGJkZi0+Y2JkX3NjICYgQkRfU0NfUkVBRFkpCisJCTsKKworCS8qIExvYWQgdGhlIGNoYXJhY3RlciBpbnRvIHRoZSB0cmFuc21pdCBidWZmZXIuCisJICovCisJKih2b2xhdGlsZSBjaGFyICopdGJkZi0+Y2JkX2J1ZmFkZHIgPSBjOworCXRiZGYtPmNiZF9kYXRsZW4gPSAxOworCXRiZGYtPmNiZF9zYyB8PSBCRF9TQ19SRUFEWTsKK30KKwordm9pZAorcHV0RGVidWdTdHIgKGNvbnN0IGNoYXIgKnMpCit7CisJd2hpbGUgKCpzKSB7CisJCXB1dERlYnVnQ2hhciAoKnMrKyk7CisJfQorfQorCitpbnQKK2dldERlYnVnQ2hhcih2b2lkKQoreworCXZvbGF0aWxlIGNiZF90CQkqcmJkZjsKKwl2b2xhdGlsZSBzY2NfdWFydF90CSp1cDsKKwl2b2xhdGlsZSBpbW1hcF90CSppbTsKKwl1bnNpZ25lZCBjaGFyCQljOworCisJaW0gPSAoaW1tYXBfdCAqKUNPTkZJR19TWVNfSU1NUjsKKwl1cCA9IChzY2NfdWFydF90ICopJmltLT5pbV9kcHJhbWJhc2VbS0dEQl9QUk9GRl9TQ0NdOworCXJiZGYgPSAoY2JkX3QgKikmaW0tPmltX2RwcmFtYmFzZVt1cC0+c2NjX2dlbnNjYy5zY2NfcmJhc2VdOworCisJLyogV2FpdCBmb3IgY2hhcmFjdGVyIHRvIHNob3cgdXAuCisJICovCisJd2hpbGUgKHJiZGYtPmNiZF9zYyAmIEJEX1NDX0VNUFRZKQorCQk7CisKKwkvKiBHcmFiIHRoZSBjaGFyIGFuZCBjbGVhciB0aGUgYnVmZmVyIGFnYWluLgorCSAqLworCWMgPSAqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKilyYmRmLT5jYmRfYnVmYWRkcjsKKwlyYmRmLT5jYmRfc2MgfD0gQkRfU0NfRU1QVFk7CisKKwlyZXR1cm4gKGMpOworfQorCit2b2lkCitrZ2RiX2ludGVycnVwdGlibGUoaW50IHllcykKK3sKKwlyZXR1cm47Cit9CisKKyNlbmRpZgkvKiBDT05GSUdfS0dEQl9PTl9TQ0MgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI2MC9zZXJpYWxfc21jLmMgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgyNjAvc2VyaWFsX3NtYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiNmVhYmEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgyNjAvc2VyaWFsX3NtYy5jCkBAIC0wLDAgKzEsNDY3IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAwLCAyMDAxLCAyMDAyCisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqIEhhY2tlZCBmb3IgTVBDODI2MCBieSBNdXJyYXkuSmVuc2VuQGNtc3QuY3Npcm8uYXUsIDE5LU9jdC0wMCwgd2l0aAorICogY2hhbmdlcyBiYXNlZCBvbiB0aGUgZmlsZSBhcmNoL3Bvd2VycGMvbWJ4Ym9vdC9tODI2MF90dHkuYyBmcm9tIHRoZQorICogTGludXgvUFBDIHNvdXJjZXMgKG04MjYwX3R0eS5jIGhhZCBubyBjb3B5cmlnaHQgaW5mbyBpbiBpdCkuCisgKi8KKworLyoKKyAqIE1pbmltYWwgc2VyaWFsIGZ1bmN0aW9ucyBuZWVkZWQgdG8gdXNlIG9uZSBvZiB0aGUgU01DIHBvcnRzCisgKiBhcyBzZXJpYWwgY29uc29sZSBpbnRlcmZhY2UuCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPG1wYzgyNjAuaD4KKyNpbmNsdWRlIDxhc20vY3BtXzgyNjAuaD4KKworREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKyNpZiBkZWZpbmVkKENPTkZJR19DT05TX09OX1NNQykKKworI2lmIENPTkZJR19DT05TX0lOREVYID09IDEJLyogQ29uc29sZSBvbiBTTUMxICovCisKKyNkZWZpbmUgU01DX0lOREVYCQkwCisjZGVmaW5lIFBST0ZGX1NNQ19CQVNFCQlQUk9GRl9TTUMxX0JBU0UKKyNkZWZpbmUgUFJPRkZfU01DCQlQUk9GRl9TTUMxCisjZGVmaW5lIENQTV9DUl9TTUNfUEFHRQkJQ1BNX0NSX1NNQzFfUEFHRQorI2RlZmluZSBDUE1fQ1JfU01DX1NCTE9DSwlDUE1fQ1JfU01DMV9TQkxPQ0sKKyNkZWZpbmUgQ01YU01SX01BU0sJCShDTVhTTVJfU01DMXxDTVhTTVJfU01DMUNTX01TSykKKyNkZWZpbmUgQ01YU01SX1ZBTFVFCQlDTVhTTVJfU01DMUNTX0JSRzcKKworI2VsaWYgQ09ORklHX0NPTlNfSU5ERVggPT0gMgkvKiBDb25zb2xlIG9uIFNNQzIgKi8KKworI2RlZmluZSBTTUNfSU5ERVgJCTEKKyNkZWZpbmUgUFJPRkZfU01DX0JBU0UJCVBST0ZGX1NNQzJfQkFTRQorI2RlZmluZSBQUk9GRl9TTUMJCVBST0ZGX1NNQzIKKyNkZWZpbmUgQ1BNX0NSX1NNQ19QQUdFCQlDUE1fQ1JfU01DMl9QQUdFCisjZGVmaW5lIENQTV9DUl9TTUNfU0JMT0NLCUNQTV9DUl9TTUMyX1NCTE9DSworI2RlZmluZSBDTVhTTVJfTUFTSwkJKENNWFNNUl9TTUMyfENNWFNNUl9TTUMyQ1NfTVNLKQorI2RlZmluZSBDTVhTTVJfVkFMVUUJCUNNWFNNUl9TTUMyQ1NfQlJHOAorCisjZWxzZQorCisjZXJyb3IgImNvbnNvbGUgbm90IGNvcnJlY3RseSBkZWZpbmVkIgorCisjZW5kaWYKKworI2lmICFkZWZpbmVkKENPTkZJR19TWVNfU01DX1JYQlVGTEVOKQorI2RlZmluZSBDT05GSUdfU1lTX1NNQ19SWEJVRkxFTgkxCisjZGVmaW5lIENPTkZJR19TWVNfTUFYSURMRQkwCisjZWxzZQorI2lmICFkZWZpbmVkKENPTkZJR19TWVNfTUFYSURMRSkKKyNlcnJvciAieW91IG11c3QgZGVmaW5lIENPTkZJR19TWVNfTUFYSURMRSIKKyNlbmRpZgorI2VuZGlmCisKK3R5cGVkZWYgdm9sYXRpbGUgc3RydWN0IHNlcmlhbGJ1ZmZlciB7CisJY2JkX3QJcnhiZDsJCS8qIFJ4IEJEICovCisJY2JkX3QJdHhiZDsJCS8qIFR4IEJEICovCisJdWludAlyeGluZGV4OwkvKiBpbmRleCBmb3IgbmV4dCBjaGFyYWN0ZXIgdG8gcmVhZCAqLworCXZvbGF0aWxlIHVjaGFyCXJ4YnVmW0NPTkZJR19TWVNfU01DX1JYQlVGTEVOXTsvKiByeCBidWZmZXJzICovCisJdm9sYXRpbGUgdWNoYXIJdHhidWY7CS8qIHR4IGJ1ZmZlcnMgKi8KK30gc2VyaWFsYnVmZmVyX3Q7CisKKy8qIG1hcCByc190YWJsZSBpbmRleCB0byBiYXVkIHJhdGUgZ2VuZXJhdG9yIGluZGV4ICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBicmdfbWFwW10gPSB7CisJNiwJLyogQlJHNyBmb3IgU01DMSAqLworCTcsCS8qIEJSRzggZm9yIFNNQzIgKi8KKwkwLAkvKiBCUkcxIGZvciBTQ0MxICovCisJMSwJLyogQlJHMSBmb3IgU0NDMiAqLworCTIsCS8qIEJSRzEgZm9yIFNDQzMgKi8KKwkzLAkvKiBCUkcxIGZvciBTQ0M0ICovCit9OworCitpbnQgc2VyaWFsX2luaXQgKHZvaWQpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW0gPSAoaW1tYXBfdCAqKUNPTkZJR19TWVNfSU1NUjsKKwl2b2xhdGlsZSBzbWNfdCAqc3A7CisJdm9sYXRpbGUgc21jX3VhcnRfdCAqdXA7CisJdm9sYXRpbGUgY3BtODI2MF90ICpjcCA9ICYoaW0tPmltX2NwbSk7CisJdWludAlkcGFkZHI7CisJdm9sYXRpbGUgc2VyaWFsYnVmZmVyX3QgKnJ0eDsKKworCS8qIGluaXRpYWxpemUgcG9pbnRlcnMgdG8gU01DICovCisKKwlzcCA9IChzbWNfdCAqKSAmKGltLT5pbV9zbWNbU01DX0lOREVYXSk7CisJKih1c2hvcnQgKikoJmltLT5pbV9kcHJhbWJhc2VbUFJPRkZfU01DX0JBU0VdKSA9IFBST0ZGX1NNQzsKKwl1cCA9IChzbWNfdWFydF90ICopJmltLT5pbV9kcHJhbWJhc2VbUFJPRkZfU01DXTsKKworCS8qIERpc2FibGUgdHJhbnNtaXR0ZXIvcmVjZWl2ZXIuICovCisJc3AtPnNtY19zbWNtciAmPSB+KFNNQ01SX1JFTiB8IFNNQ01SX1RFTik7CisKKwkvKiBOT1RFOiBJL08gcG9ydCBwaW5zIGFyZSBzZXQgdXAgdmlhIHRoZSBpb3BfY29uZl90YWJbXSB0YWJsZSAqLworCisJLyogQWxsb2NhdGUgc3BhY2UgZm9yIHR3byBidWZmZXIgZGVzY3JpcHRvcnMgaW4gdGhlIERQIHJhbS4KKwkgKiBkYW1tOiBhbGxvY2F0aW5nIHNwYWNlIGFmdGVyIHRoZSB0d28gYnVmZmVycyBmb3IgcngvdHggZGF0YQorCSAqLworCisJLyogYWxsb2NhdGUgc2l6ZSBvZiBzdHJ1Y3Qgc2VyaWFsYnVmZmVyIHdpdGggYmQgcngvdHgsCisJICogYnVmZmVyIHJ4L3R4IGFuZCByeCBpbmRleAorCSAqLworCWRwYWRkciA9IG04MjYwX2NwbV9kcGFsbG9jKChzaXplb2Yoc2VyaWFsYnVmZmVyX3QpKSwgMTYpOworCisJcnR4ID0gKHNlcmlhbGJ1ZmZlcl90ICopJmltLT5pbV9kcHJhbWJhc2VbZHBhZGRyXTsKKworCS8qIFNldCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgaG9zdCBtZW1vcnkgYnVmZmVycyBpbgorCSAqIHRoZSBidWZmZXIgZGVzY3JpcHRvcnMuCisJICovCisJcnR4LT5yeGJkLmNiZF9idWZhZGRyID0gKHVpbnQpICZydHgtPnJ4YnVmOworCXJ0eC0+cnhiZC5jYmRfc2MgICAgICA9IDA7CisKKwlydHgtPnR4YmQuY2JkX2J1ZmFkZHIgPSAodWludCkgJnJ0eC0+dHhidWY7CisJcnR4LT50eGJkLmNiZF9zYyAgICAgID0gMDsKKworCS8qIFNldCB1cCB0aGUgdWFydCBwYXJhbWV0ZXJzIGluIHRoZSBwYXJhbWV0ZXIgcmFtLiAqLworCXVwLT5zbWNfcmJhc2UgPSBkcGFkZHI7CisJdXAtPnNtY190YmFzZSA9IGRwYWRkcitzaXplb2YoY2JkX3QpOworCXVwLT5zbWNfcmZjciA9IENQTUZDUl9FQjsKKwl1cC0+c21jX3RmY3IgPSBDUE1GQ1JfRUI7CisJdXAtPnNtY19icmtsZW4gPSAwOworCXVwLT5zbWNfYnJrZWMgPSAwOworCXVwLT5zbWNfYnJrY3IgPSAwOworCisJLyogU2V0IFVBUlQgbW9kZSwgOCBiaXQsIG5vIHBhcml0eSwgb25lIHN0b3AuCisJICogRW5hYmxlIHJlY2VpdmUgYW5kIHRyYW5zbWl0LgorCSAqLworCXNwLT5zbWNfc21jbXIgPSBzbWNyX21rX2NsZW4oOSkgfCAgU01DTVJfU01fVUFSVDsKKworCS8qIE1hc2sgYWxsIGludGVycnVwdHMgYW5kIHJlbW92ZSBhbnl0aGluZyBwZW5kaW5nLiAqLworCXNwLT5zbWNfc21jbSA9IDA7CisJc3AtPnNtY19zbWNlID0gMHhmZjsKKworCS8qIHB1dCB0aGUgU01DIGNoYW5uZWwgaW50byBOTVNJIChub24gbXVsdGlwbGV4ZCBzZXJpYWwgaW50ZXJmYWNlKQorCSAqIG1vZGUgYW5kIHdpcmUgZWl0aGVyIEJSRzcgdG8gU01DMSBvciBCUkc4IHRvIFNNQzIgKDE1LTE3KS4KKwkgKi8KKwlpbS0+aW1fY3BtdXguY214X3NtciA9IChpbS0+aW1fY3BtdXguY214X3NtciZ+Q01YU01SX01BU0spfENNWFNNUl9WQUxVRTsKKworCS8qIFNldCB1cCB0aGUgYmF1ZCByYXRlIGdlbmVyYXRvci4gKi8KKwlzZXJpYWxfc2V0YnJnICgpOworCisJLyogTWFrZSB0aGUgZmlyc3QgYnVmZmVyIHRoZSBvbmx5IGJ1ZmZlci4gKi8KKwlydHgtPnR4YmQuY2JkX3NjIHw9IEJEX1NDX1dSQVA7CisJcnR4LT5yeGJkLmNiZF9zYyB8PSBCRF9TQ19FTVBUWSB8IEJEX1NDX1dSQVA7CisKKwkvKiBzaW5nbGUvbXVsdGkgY2hhcmFjdGVyIHJlY2VpdmUuICovCisJdXAtPnNtY19tcmJsciA9IENPTkZJR19TWVNfU01DX1JYQlVGTEVOOworCXVwLT5zbWNfbWF4aWRsID0gQ09ORklHX1NZU19NQVhJRExFOworCXJ0eC0+cnhpbmRleCA9IDA7CisKKwkvKiBJbml0aWFsaXplIFR4L1J4IHBhcmFtZXRlcnMuICovCisKKwl3aGlsZSAoY3AtPmNwX2NwY3IgJiBDUE1fQ1JfRkxHKSAgLyogd2FpdCBpZiBjcCBpcyBidXN5ICovCisJICA7CisKKwljcC0+Y3BfY3BjciA9IG1rX2NyX2NtZChDUE1fQ1JfU01DX1BBR0UsIENQTV9DUl9TTUNfU0JMT0NLLAorCQkJCQkwLCBDUE1fQ1JfSU5JVF9UUlgpIHwgQ1BNX0NSX0ZMRzsKKworCXdoaWxlIChjcC0+Y3BfY3BjciAmIENQTV9DUl9GTEcpICAvKiB3YWl0IGlmIGNwIGlzIGJ1c3kgKi8KKwkgIDsKKworCS8qIEVuYWJsZSB0cmFuc21pdHRlci9yZWNlaXZlci4gKi8KKwlzcC0+c21jX3NtY21yIHw9IFNNQ01SX1JFTiB8IFNNQ01SX1RFTjsKKworCXJldHVybiAoMCk7Cit9CisKK3ZvaWQKK3NlcmlhbF9zZXRicmcgKHZvaWQpCit7CisjaWYgZGVmaW5lZChDT05GSUdfQ09OU19VU0VfRVhUQykKKwltODI2MF9jcG1fZXh0Y2JyZyhicmdfbWFwW1NNQ19JTkRFWF0sIGdkLT5iYXVkcmF0ZSwKKwkJQ09ORklHX0NPTlNfRVhUQ19SQVRFLCBDT05GSUdfQ09OU19FWFRDX1BJTlNFTCk7CisjZWxzZQorCW04MjYwX2NwbV9zZXRicmcoYnJnX21hcFtTTUNfSU5ERVhdLCBnZC0+YmF1ZHJhdGUpOworI2VuZGlmCit9CisKK3ZvaWQKK3NlcmlhbF9wdXRjKGNvbnN0IGNoYXIgYykKK3sKKwl2b2xhdGlsZSBzbWNfdWFydF90CSp1cDsKKwl2b2xhdGlsZSBpbW1hcF90CSppbSA9IChpbW1hcF90ICopQ09ORklHX1NZU19JTU1SOworCXZvbGF0aWxlIHNlcmlhbGJ1ZmZlcl90CSpydHg7CisKKwlpZiAoYyA9PSAnXG4nKQorCQlzZXJpYWxfcHV0YyAoJ1xyJyk7CisKKwl1cCA9IChzbWNfdWFydF90ICopJihpbS0+aW1fZHByYW1iYXNlW1BST0ZGX1NNQ10pOworCisJcnR4ID0gKHNlcmlhbGJ1ZmZlcl90ICopJmltLT5pbV9kcHJhbWJhc2VbdXAtPnNtY19yYmFzZV07CisKKwkvKiBXYWl0IGZvciBsYXN0IGNoYXJhY3RlciB0byBnby4gKi8KKwl3aGlsZSAocnR4LT50eGJkLmNiZF9zYyAmIEJEX1NDX1JFQURZICYgQkRfU0NfUkVBRFkpCisJCTsKKwlydHgtPnR4YnVmID0gYzsKKwlydHgtPnR4YmQuY2JkX2RhdGxlbiA9IDE7CisJcnR4LT50eGJkLmNiZF9zYyB8PSBCRF9TQ19SRUFEWTsKK30KKwordm9pZAorc2VyaWFsX3B1dHMgKGNvbnN0IGNoYXIgKnMpCit7CisJd2hpbGUgKCpzKSB7CisJCXNlcmlhbF9wdXRjICgqcysrKTsKKwl9Cit9CisKK2ludAorc2VyaWFsX2dldGModm9pZCkKK3sKKwl2b2xhdGlsZSBzbWNfdWFydF90CSp1cDsKKwl2b2xhdGlsZSBpbW1hcF90CSppbSA9IChpbW1hcF90ICopQ09ORklHX1NZU19JTU1SOworCXZvbGF0aWxlIHNlcmlhbGJ1ZmZlcl90CSpydHg7CisJdW5zaWduZWQgY2hhciAgYzsKKworCXVwID0gKHNtY191YXJ0X3QgKikmKGltLT5pbV9kcHJhbWJhc2VbUFJPRkZfU01DXSk7CisKKwlydHggPSAoc2VyaWFsYnVmZmVyX3QgKikmaW0tPmltX2RwcmFtYmFzZVt1cC0+c21jX3JiYXNlXTsKKworCS8qIFdhaXQgZm9yIGNoYXJhY3RlciB0byBzaG93IHVwLiAqLworCXdoaWxlIChydHgtPnJ4YmQuY2JkX3NjICYgQkRfU0NfRU1QVFkpCisJCTsKKworCS8qIHRoZSBjaGFyYWN0ZXJzIGFyZSByZWFkIG9uZSBieSBvbmUsCisJICogdXNlIHRoZSByeGluZGV4IHRvIGtub3cgdGhlIG5leHQgY2hhciB0byBkZWxpdmVyCisJICovCisJYyA9ICoodW5zaWduZWQgY2hhciAqKSAocnR4LT5yeGJkLmNiZF9idWZhZGRyICsgcnR4LT5yeGluZGV4KTsKKwlydHgtPnJ4aW5kZXgrKzsKKworCS8qIGNoZWNrIGlmIGFsbCBjaGFyIGFyZSByZWFkb3V0LCB0aGVuIG1ha2UgcHJlcGFyZSBmb3IgbmV4dCByZWNlaXZlICovCisJaWYgKHJ0eC0+cnhpbmRleCA+PSBydHgtPnJ4YmQuY2JkX2RhdGxlbikgeworCQlydHgtPnJ4aW5kZXggPSAwOworCQlydHgtPnJ4YmQuY2JkX3NjIHw9IEJEX1NDX0VNUFRZOworCX0KKwlyZXR1cm4oYyk7Cit9CisKK2ludAorc2VyaWFsX3RzdGMoKQoreworCXZvbGF0aWxlIHNtY191YXJ0X3QJKnVwOworCXZvbGF0aWxlIGltbWFwX3QJKmltID0gKGltbWFwX3QgKilDT05GSUdfU1lTX0lNTVI7CisJdm9sYXRpbGUgc2VyaWFsYnVmZmVyX3QJKnJ0eDsKKworCXVwID0gKHNtY191YXJ0X3QgKikmKGltLT5pbV9kcHJhbWJhc2VbUFJPRkZfU01DXSk7CisJcnR4ID0gKHNlcmlhbGJ1ZmZlcl90ICopJmltLT5pbV9kcHJhbWJhc2VbdXAtPnNtY19yYmFzZV07CisKKwlyZXR1cm4gIShydHgtPnJ4YmQuY2JkX3NjICYgQkRfU0NfRU1QVFkpOworfQorCisjZW5kaWYJLyogQ09ORklHX0NPTlNfT05fU01DICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19LR0RCX09OX1NNQykKKworI2lmIGRlZmluZWQoQ09ORklHX0NPTlNfT05fU01DKSAmJiBDT05GSUdfS0dEQl9JTkRFWCA9PSBDT05GSUdfQ09OU19JTkRFWAorI2Vycm9yIFdob29wcyEgc2VyaWFsIGNvbnNvbGUgYW5kIGtnZGIgYXJlIG9uIHRoZSBzYW1lIHNtYyBzZXJpYWwgcG9ydAorI2VuZGlmCisKKyNpZiBDT05GSUdfS0dEQl9JTkRFWCA9PSAxCS8qIEtHREIgUG9ydCBvbiBTTUMxICovCisKKyNkZWZpbmUgS0dEQl9TTUNfSU5ERVgJCTAKKyNkZWZpbmUgS0dEQl9QUk9GRl9TTUNfQkFTRQlQUk9GRl9TTUMxX0JBU0UKKyNkZWZpbmUgS0dEQl9QUk9GRl9TTUMJCVBST0ZGX1NNQzEKKyNkZWZpbmUgS0dEQl9DUE1fQ1JfU01DX1BBR0UJQ1BNX0NSX1NNQzFfUEFHRQorI2RlZmluZSBLR0RCX0NQTV9DUl9TTUNfU0JMT0NLCUNQTV9DUl9TTUMxX1NCTE9DSworI2RlZmluZSBLR0RCX0NNWFNNUl9NQVNLCShDTVhTTVJfU01DMXxDTVhTTVJfU01DMUNTX01TSykKKyNkZWZpbmUgS0dEQl9DTVhTTVJfVkFMVUUJQ01YU01SX1NNQzFDU19CUkc3CisKKyNlbGlmIENPTkZJR19LR0RCX0lOREVYID09IDIJLyogS0dEQiBQb3J0IG9uIFNNQzIgKi8KKworI2RlZmluZSBLR0RCX1NNQ19JTkRFWAkJMQorI2RlZmluZSBLR0RCX1BST0ZGX1NNQ19CQVNFCVBST0ZGX1NNQzJfQkFTRQorI2RlZmluZSBLR0RCX1BST0ZGX1NNQwkJUFJPRkZfU01DMgorI2RlZmluZSBLR0RCX0NQTV9DUl9TTUNfUEFHRQlDUE1fQ1JfU01DMl9QQUdFCisjZGVmaW5lIEtHREJfQ1BNX0NSX1NNQ19TQkxPQ0sJQ1BNX0NSX1NNQzJfU0JMT0NLCisjZGVmaW5lIEtHREJfQ01YU01SX01BU0sJKENNWFNNUl9TTUMyfENNWFNNUl9TTUMyQ1NfTVNLKQorI2RlZmluZSBLR0RCX0NNWFNNUl9WQUxVRQlDTVhTTVJfU01DMkNTX0JSRzgKKworI2Vsc2UKKworI2Vycm9yICJjb25zb2xlIG5vdCBjb3JyZWN0bHkgZGVmaW5lZCIKKworI2VuZGlmCisKK3ZvaWQKK2tnZGJfc2VyaWFsX2luaXQgKHZvaWQpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW0gPSAoaW1tYXBfdCAqKUNPTkZJR19TWVNfSU1NUjsKKwl2b2xhdGlsZSBzbWNfdCAqc3A7CisJdm9sYXRpbGUgc21jX3VhcnRfdCAqdXA7CisJdm9sYXRpbGUgY2JkX3QgKnRiZGYsICpyYmRmOworCXZvbGF0aWxlIGNwbTgyNjBfdCAqY3AgPSAmKGltLT5pbV9jcG0pOworCXVpbnQgZHBhZGRyLCBzcGVlZCA9IENPTkZJR19LR0RCX0JBVURSQVRFOworCWNoYXIgKnMsICplOworCisJaWYgKChzID0gZ2V0ZW52KCJrZ2RicmF0ZSIpKSAhPSBOVUxMICYmICpzICE9ICdcMCcpIHsKKwkJdWxvbmcgcmF0ZSA9IHNpbXBsZV9zdHJ0b3VsKHMsICZlLCAxMCk7CisJCWlmIChlID4gcyAmJiAqZSA9PSAnXDAnKQorCQkJc3BlZWQgPSByYXRlOworCX0KKworCS8qIGluaXRpYWxpemUgcG9pbnRlcnMgdG8gU01DICovCisKKwlzcCA9IChzbWNfdCAqKSAmKGltLT5pbV9zbWNbS0dEQl9TTUNfSU5ERVhdKTsKKwkqKHVzaG9ydCAqKSgmaW0tPmltX2RwcmFtYmFzZVtLR0RCX1BST0ZGX1NNQ19CQVNFXSkgPSBLR0RCX1BST0ZGX1NNQzsKKwl1cCA9IChzbWNfdWFydF90ICopJmltLT5pbV9kcHJhbWJhc2VbS0dEQl9QUk9GRl9TTUNdOworCisJLyogRGlzYWJsZSB0cmFuc21pdHRlci9yZWNlaXZlci4gKi8KKwlzcC0+c21jX3NtY21yICY9IH4oU01DTVJfUkVOIHwgU01DTVJfVEVOKTsKKworCS8qIE5PVEU6IEkvTyBwb3J0IHBpbnMgYXJlIHNldCB1cCB2aWEgdGhlIGlvcF9jb25mX3RhYltdIHRhYmxlICovCisKKwkvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdHdvIGJ1ZmZlciBkZXNjcmlwdG9ycyBpbiB0aGUgRFAgcmFtLgorCSAqIGRhbW06IGFsbG9jYXRpbmcgc3BhY2UgYWZ0ZXIgdGhlIHR3byBidWZmZXJzIGZvciByeC90eCBkYXRhCisJICovCisKKwlkcGFkZHIgPSBtODI2MF9jcG1fZHBhbGxvYygoMiAqIHNpemVvZiAoY2JkX3QpKSArIDIsIDE2KTsKKworCS8qIFNldCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgaG9zdCBtZW1vcnkgYnVmZmVycyBpbgorCSAqIHRoZSBidWZmZXIgZGVzY3JpcHRvcnMuCisJICovCisJcmJkZiA9IChjYmRfdCAqKSZpbS0+aW1fZHByYW1iYXNlW2RwYWRkcl07CisJcmJkZi0+Y2JkX2J1ZmFkZHIgPSAodWludCkgKHJiZGYrMik7CisJcmJkZi0+Y2JkX3NjID0gMDsKKwl0YmRmID0gcmJkZiArIDE7CisJdGJkZi0+Y2JkX2J1ZmFkZHIgPSAoKHVpbnQpIChyYmRmKzIpKSArIDE7CisJdGJkZi0+Y2JkX3NjID0gMDsKKworCS8qIFNldCB1cCB0aGUgdWFydCBwYXJhbWV0ZXJzIGluIHRoZSBwYXJhbWV0ZXIgcmFtLiAqLworCXVwLT5zbWNfcmJhc2UgPSBkcGFkZHI7CisJdXAtPnNtY190YmFzZSA9IGRwYWRkcitzaXplb2YoY2JkX3QpOworCXVwLT5zbWNfcmZjciA9IENQTUZDUl9FQjsKKwl1cC0+c21jX3RmY3IgPSBDUE1GQ1JfRUI7CisJdXAtPnNtY19icmtsZW4gPSAwOworCXVwLT5zbWNfYnJrZWMgPSAwOworCXVwLT5zbWNfYnJrY3IgPSAwOworCisJLyogU2V0IFVBUlQgbW9kZSwgOCBiaXQsIG5vIHBhcml0eSwgb25lIHN0b3AuCisJICogRW5hYmxlIHJlY2VpdmUgYW5kIHRyYW5zbWl0LgorCSAqLworCXNwLT5zbWNfc21jbXIgPSBzbWNyX21rX2NsZW4oOSkgfCAgU01DTVJfU01fVUFSVDsKKworCS8qIE1hc2sgYWxsIGludGVycnVwdHMgYW5kIHJlbW92ZSBhbnl0aGluZyBwZW5kaW5nLiAqLworCXNwLT5zbWNfc21jbSA9IDA7CisJc3AtPnNtY19zbWNlID0gMHhmZjsKKworCS8qIHB1dCB0aGUgU01DIGNoYW5uZWwgaW50byBOTVNJIChub24gbXVsdGlwbGV4ZCBzZXJpYWwgaW50ZXJmYWNlKQorCSAqIG1vZGUgYW5kIHdpcmUgZWl0aGVyIEJSRzcgdG8gU01DMSBvciBCUkc4IHRvIFNNQzIgKDE1LTE3KS4KKwkgKi8KKwlpbS0+aW1fY3BtdXguY214X3NtciA9CisJCShpbS0+aW1fY3BtdXguY214X3NtciAmIH5LR0RCX0NNWFNNUl9NQVNLKSB8IEtHREJfQ01YU01SX1ZBTFVFOworCisJLyogU2V0IHVwIHRoZSBiYXVkIHJhdGUgZ2VuZXJhdG9yLiAqLworI2lmIGRlZmluZWQoQ09ORklHX0tHREJfVVNFX0VYVEMpCisJbTgyNjBfY3BtX2V4dGNicmcoYnJnX21hcFtLR0RCX1NNQ19JTkRFWF0sIHNwZWVkLAorCQlDT05GSUdfS0dEQl9FWFRDX1JBVEUsIENPTkZJR19LR0RCX0VYVENfUElOU0VMKTsKKyNlbHNlCisJbTgyNjBfY3BtX3NldGJyZyhicmdfbWFwW0tHREJfU01DX0lOREVYXSwgc3BlZWQpOworI2VuZGlmCisKKwkvKiBNYWtlIHRoZSBmaXJzdCBidWZmZXIgdGhlIG9ubHkgYnVmZmVyLiAqLworCXRiZGYtPmNiZF9zYyB8PSBCRF9TQ19XUkFQOworCXJiZGYtPmNiZF9zYyB8PSBCRF9TQ19FTVBUWSB8IEJEX1NDX1dSQVA7CisKKwkvKiBTaW5nbGUgY2hhcmFjdGVyIHJlY2VpdmUuICovCisJdXAtPnNtY19tcmJsciA9IDE7CisJdXAtPnNtY19tYXhpZGwgPSAwOworCisJLyogSW5pdGlhbGl6ZSBUeC9SeCBwYXJhbWV0ZXJzLiAqLworCisJd2hpbGUgKGNwLT5jcF9jcGNyICYgQ1BNX0NSX0ZMRykgIC8qIHdhaXQgaWYgY3AgaXMgYnVzeSAqLworCSAgOworCisJY3AtPmNwX2NwY3IgPSBta19jcl9jbWQoS0dEQl9DUE1fQ1JfU01DX1BBR0UsIEtHREJfQ1BNX0NSX1NNQ19TQkxPQ0ssCisJCQkJCTAsIENQTV9DUl9JTklUX1RSWCkgfCBDUE1fQ1JfRkxHOworCisJd2hpbGUgKGNwLT5jcF9jcGNyICYgQ1BNX0NSX0ZMRykgIC8qIHdhaXQgaWYgY3AgaXMgYnVzeSAqLworCSAgOworCisJLyogRW5hYmxlIHRyYW5zbWl0dGVyL3JlY2VpdmVyLgkqLworCXNwLT5zbWNfc21jbXIgfD0gU01DTVJfUkVOIHwgU01DTVJfVEVOOworCisJcHJpbnRmKCJTTUMlZCBhdCAlZGJwcyAiLCBDT05GSUdfS0dEQl9JTkRFWCwgc3BlZWQpOworfQorCit2b2lkCitwdXREZWJ1Z0NoYXIoY29uc3QgY2hhciBjKQoreworCXZvbGF0aWxlIGNiZF90CQkqdGJkZjsKKwl2b2xhdGlsZSBjaGFyCQkqYnVmOworCXZvbGF0aWxlIHNtY191YXJ0X3QJKnVwOworCXZvbGF0aWxlIGltbWFwX3QJKmltID0gKGltbWFwX3QgKilDT05GSUdfU1lTX0lNTVI7CisKKwlpZiAoYyA9PSAnXG4nKQorCQlwdXREZWJ1Z0NoYXIgKCdccicpOworCisJdXAgPSAoc21jX3VhcnRfdCAqKSYoaW0tPmltX2RwcmFtYmFzZVtLR0RCX1BST0ZGX1NNQ10pOworCisJdGJkZiA9IChjYmRfdCAqKSZpbS0+aW1fZHByYW1iYXNlW3VwLT5zbWNfdGJhc2VdOworCisJLyogV2FpdCBmb3IgbGFzdCBjaGFyYWN0ZXIgdG8gZ28uICovCisJYnVmID0gKGNoYXIgKil0YmRmLT5jYmRfYnVmYWRkcjsKKwl3aGlsZSAodGJkZi0+Y2JkX3NjICYgQkRfU0NfUkVBRFkpCisJCTsKKworCSpidWYgPSBjOworCXRiZGYtPmNiZF9kYXRsZW4gPSAxOworCXRiZGYtPmNiZF9zYyB8PSBCRF9TQ19SRUFEWTsKK30KKwordm9pZAorcHV0RGVidWdTdHIgKGNvbnN0IGNoYXIgKnMpCit7CisJd2hpbGUgKCpzKSB7CisJCXB1dERlYnVnQ2hhciAoKnMrKyk7CisJfQorfQorCitpbnQKK2dldERlYnVnQ2hhcih2b2lkKQoreworCXZvbGF0aWxlIGNiZF90CQkqcmJkZjsKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyCSpidWY7CisJdm9sYXRpbGUgc21jX3VhcnRfdAkqdXA7CisJdm9sYXRpbGUgaW1tYXBfdAkqaW0gPSAoaW1tYXBfdCAqKUNPTkZJR19TWVNfSU1NUjsKKwl1bnNpZ25lZCBjaGFyCQljOworCisJdXAgPSAoc21jX3VhcnRfdCAqKSYoaW0tPmltX2RwcmFtYmFzZVtLR0RCX1BST0ZGX1NNQ10pOworCisJcmJkZiA9IChjYmRfdCAqKSZpbS0+aW1fZHByYW1iYXNlW3VwLT5zbWNfcmJhc2VdOworCisJLyogV2FpdCBmb3IgY2hhcmFjdGVyIHRvIHNob3cgdXAuICovCisJYnVmID0gKHVuc2lnbmVkIGNoYXIgKilyYmRmLT5jYmRfYnVmYWRkcjsKKwl3aGlsZSAocmJkZi0+Y2JkX3NjICYgQkRfU0NfRU1QVFkpCisJCTsKKwljID0gKmJ1ZjsKKwlyYmRmLT5jYmRfc2MgfD0gQkRfU0NfRU1QVFk7CisKKwlyZXR1cm4oYyk7Cit9CisKK3ZvaWQKK2tnZGJfaW50ZXJydXB0aWJsZShpbnQgeWVzKQoreworCXJldHVybjsKK30KKworI2VuZGlmCS8qIENPTkZJR19LR0RCX09OX1NNQyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjYwL3NwZWVkLmMgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgyNjAvc3BlZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTFjMmIwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjYwL3NwZWVkLmMKQEAgLTAsMCArMSwyNTMgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAtMjAwMgorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8bXBjODI2MC5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKworI2lmIGRlZmluZWQoQ09ORklHX0JPQVJEX0dFVF9DUFVfQ0xLX0YpCitleHRlcm4gdW5zaWduZWQgbG9uZyBib2FyZF9nZXRfY3B1X2Nsa19mICh2b2lkKTsKKyNlbmRpZgorCitERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBCdXMtdG8tQ29yZSBNdWx0aXBsaWVyICovCisjZGVmaW5lIF8xeAkyCisjZGVmaW5lIF8xXzV4CTMKKyNkZWZpbmUgXzJ4CTQKKyNkZWZpbmUgXzJfNXgJNQorI2RlZmluZSBfM3gJNgorI2RlZmluZSBfM181eAk3CisjZGVmaW5lIF80eAk4CisjZGVmaW5lIF80XzV4CTkKKyNkZWZpbmUgXzV4CTEwCisjZGVmaW5lIF81XzV4CTExCisjZGVmaW5lIF82eAkxMgorI2RlZmluZSBfNl81eAkxMworI2RlZmluZSBfN3gJMTQKKyNkZWZpbmUgXzdfNXgJMTUKKyNkZWZpbmUgXzh4CTE2CisjZGVmaW5lIF9ieXAJLTEKKyNkZWZpbmUgX29mZgktMgorI2RlZmluZSBfdW5rCS0zCisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgYjJjX211bHQ7CisJaW50IHZjb19kaXY7CisJY2hhciAqZnJlcV82MHg7CisJY2hhciAqZnJlcV9jb3JlOworfSBjb3JlY25mX3Q7CisKKy8qCisgKiB0aGlzIHRhYmxlIGJhc2VkIG9uICJFcnJhdGEgdG8gTVBDODI2MCBQb3dlclFVSUNDIElJIFVzZXIncyBNYW51YWwiLAorICogUmV2LiAxLCA4LzIwMDAsIHBhZ2UgMTAuCisgKi8KK2NvcmVjbmZfdCBjb3JlY25mX3RhYltdID0geworCXsgXzFfNXgsICA0LCAiIDMzLTEwMCIsICIgMzMtMTAwIiB9LAkvKiAweDAwICovCisJeyAgIF8xeCwgIDQsICIgNTAtMTUwIiwgIiA1MC0xNTAiIH0sCS8qIDB4MDEgKi8KKwl7ICAgXzF4LCAgOCwgIiAyNS03NSAiLCAiIDI1LTc1ICIgfSwJLyogMHgwMiAqLworCXsgIF9ieXAsIC0xLCAiICA/LT8gICIsICIgID8tPyAgIiB9LAkvKiAweDAzICovCisJeyAgIF8yeCwgIDIsICIgNTAtMTUwIiwgIjEwMC0zMDAiIH0sCS8qIDB4MDQgKi8KKwl7ICAgXzJ4LCAgNCwgIiAyNS03NSAiLCAiIDUwLTE1MCIgfSwJLyogMHgwNSAqLworCXsgXzJfNXgsICAyLCAiIDQwLTEyMCIsICIxMDAtMjQwIiB9LAkvKiAweDA2ICovCisJeyBfNF81eCwgIDIsICIgMjItNjUgIiwgIjEwMC0zMDAiIH0sCS8qIDB4MDcgKi8KKwl7ICAgXzN4LCAgMiwgIiAzMy0xMDAiLCAiMTAwLTMwMCIgfSwJLyogMHgwOCAqLworCXsgXzVfNXgsICAyLCAiIDE4LTU1ICIsICIxMDAtMzAwIiB9LAkvKiAweDA5ICovCisJeyAgIF80eCwgIDIsICIgMjUtNzUgIiwgIjEwMC0zMDAiIH0sCS8qIDB4MEEgKi8KKwl7ICAgXzV4LCAgMiwgIiAyMC02MCAiLCAiMTAwLTMwMCIgfSwJLyogMHgwQiAqLworCXsgXzFfNXgsICA4LCAiIDE2LTUwICIsICIgMTYtNTAgIiB9LAkvKiAweDBDICovCisJeyAgIF82eCwgIDIsICIgMTYtNTAgIiwgIjEwMC0zMDAiIH0sCS8qIDB4MEQgKi8KKwl7IF8zXzV4LCAgMiwgIiAzMC04NSAiLCAiMTAwLTMwMCIgfSwJLyogMHgwRSAqLworCXsgIF9vZmYsIC0xLCAiICA/LT8gICIsICIgID8tPyAgIiB9LAkvKiAweDBGICovCisJeyAgIF8zeCwgIDQsICIgMTYtNTAgIiwgIiA1MC0xNTAiIH0sCS8qIDB4MTAgKi8KKwl7IF8yXzV4LCAgNCwgIiAyMC02MCAiLCAiIDUwLTEyMCIgfSwJLyogMHgxMSAqLworCXsgXzZfNXgsICAyLCAiIDE1LTQ2ICIsICIxMDAtMzAwIiB9LAkvKiAweDEyICovCisJeyAgX2J5cCwgLTEsICIgID8tPyAgIiwgIiAgPy0/ICAiIH0sCS8qIDB4MTMgKi8KKwl7ICAgXzd4LCAgMiwgIiAxNC00MyAiLCAiMTAwLTMwMCIgfSwJLyogMHgxNCAqLworCXsgICBfMngsICA0LCAiIDI1LTc1ICIsICIgNTAtMTUwIiB9LAkvKiAweDE1ICovCisJeyBfN181eCwgIDIsICIgMTMtNDAgIiwgIjEwMC0zMDAiIH0sCS8qIDB4MTYgKi8KKwl7IF80XzV4LCAgMiwgIiAyMi02NSAiLCAiMTAwLTMwMCIgfSwJLyogMHgxNyAqLworCXsgIF91bmssIC0xLCAiICA/LT8gICIsICIgID8tPyAgIiB9LAkvKiAweDE4ICovCisJeyBfNV81eCwgIDIsICIgMTgtNTUgIiwgIjEwMC0zMDAiIH0sCS8qIDB4MTkgKi8KKwl7ICAgXzR4LCAgMiwgIiAyNS03NSAiLCAiMTAwLTMwMCIgfSwJLyogMHgxQSAqLworCXsgICBfNXgsICAyLCAiIDIwLTYwICIsICIxMDAtMzAwIiB9LAkvKiAweDFCICovCisJeyAgIF84eCwgIDIsICIgMTItMzggIiwgIjEwMC0zMDAiIH0sCS8qIDB4MUMgKi8KKwl7ICAgXzZ4LCAgMiwgIiAxNi01MCAiLCAiMTAwLTMwMCIgfSwJLyogMHgxRCAqLworCXsgXzNfNXgsICAyLCAiIDMwLTg1ICIsICIxMDAtMzAwIiB9LAkvKiAweDFFICovCisJeyAgX29mZiwgLTEsICIgID8tPyAgIiwgIiAgPy0/ICAiIH0sCS8qIDB4MUYgKi8KK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqCisgKi8KKworaW50IGdldF9jbG9ja3MgKHZvaWQpCit7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tYXAgPSAoaW1tYXBfdCAqKSBDT05GSUdfU1lTX0lNTVI7CisJdWxvbmcgY2xraW47CisJdWxvbmcgc2NjciwgZGZicmc7CisJdWxvbmcgc2NtciwgY29yZWNuZiwgYnVzZGYsIGNwbWRmLCBwbGxkZiwgcGxsbWY7CisJY29yZWNuZl90ICpjcDsKKworI2lmICFkZWZpbmVkKENPTkZJR184MjYwX0NMS0lOKQorI2Vycm9yIGNsb2NrIG1lYXN1cmluZyBub3QgaW1wbGVtZW50ZWQgeWV0IC0gZGVmaW5lIENPTkZJR184MjYwX0NMS0lOCisjZWxzZQorI2lmIGRlZmluZWQoQ09ORklHX0JPQVJEX0dFVF9DUFVfQ0xLX0YpCisJY2xraW4gPSBib2FyZF9nZXRfY3B1X2Nsa19mICgpOworI2Vsc2UKKwljbGtpbiA9IENPTkZJR184MjYwX0NMS0lOOworI2VuZGlmCisjZW5kaWYKKworCXNjY3IgPSBpbW1hcC0+aW1fY2xrcnN0LmNhcl9zY2NyOworCWRmYnJnID0gKHNjY3IgJiBTQ0NSX0RGQlJHX01TSykgPj4gU0NDUl9ERkJSR19TSElGVDsKKworCXNjbXIgPSBpbW1hcC0+aW1fY2xrcnN0LmNhcl9zY21yOworCWNvcmVjbmYgPSAoc2NtciAmIFNDTVJfQ09SRUNORl9NU0spID4+IFNDTVJfQ09SRUNORl9TSElGVDsKKwljcCA9ICZjb3JlY25mX3RhYltjb3JlY25mXTsKKworCWJ1c2RmID0gKHNjbXIgJiBTQ01SX0JVU0RGX01TSykgPj4gU0NNUl9CVVNERl9TSElGVDsKKwljcG1kZiA9IChzY21yICYgU0NNUl9DUE1ERl9NU0spID4+IFNDTVJfQ1BNREZfU0hJRlQ7CisKKwkvKiBIaVA3LCBIaVA3IFJldjAxLCBIaVA3IFJldkEgKi8KKwlpZiAoKGdldF9wdnIgKCkgPT0gUFZSXzgyNjBfSElQNykgfHwKKwkgICAgKGdldF9wdnIgKCkgPT0gUFZSXzgyNjBfSElQN1IxKSB8fAorCSAgICAoZ2V0X3B2ciAoKSA9PSBQVlJfODI2MF9ISVA3UkEpKSB7CisJCXBsbG1mID0gKHNjbXIgJiBTQ01SX1BMTE1GX01TS0g3KSA+PiBTQ01SX1BMTE1GX1NISUZUOworCQlnZC0+dmNvX291dCA9IGNsa2luICogKHBsbG1mICsgMSk7CisJfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBIaVAzLCBIaVA0ICovCisJCXBsbG1mID0gKHNjbXIgJiBTQ01SX1BMTE1GX01TSykgPj4gU0NNUl9QTExNRl9TSElGVDsKKwkJcGxsZGYgPSAoc2NtciAmIFNDTVJfUExMREYpID8gMSA6IDA7CisJCWdkLT52Y29fb3V0ID0gKGNsa2luICogMiAqIChwbGxtZiArIDEpKSAvIChwbGxkZiArIDEpOworCX0KKyNpZiAwCisJaWYgKGdkLT52Y29fb3V0IC8gKGJ1c2RmICsgMSkgIT0gY2xraW4pIHsKKwkJLyogYWFhcnJyZ2dnaGhoISEhICovCisJCXJldHVybiAoMSk7CisJfQorI2VuZGlmCisKKwlnZC0+Y3BtX2NsayA9IGdkLT52Y29fb3V0IC8gMjsKKwlnZC0+YnVzX2NsayA9IGNsa2luOworCWdkLT5zY2NfY2xrID0gZ2QtPnZjb19vdXQgLyA0OworCWdkLT5icmdfY2xrID0gZ2QtPnZjb19vdXQgLyAoMSA8PCAoMiAqIChkZmJyZyArIDEpKSk7CisKKwlpZiAoY3AtPmIyY19tdWx0ID4gMCkgeworCQlnZC0+Y3B1X2NsayA9IChjbGtpbiAqIGNwLT5iMmNfbXVsdCkgLyAyOworCX0gZWxzZSB7CisJCWdkLT5jcHVfY2xrID0gY2xraW47CisJfQorCisjaWZkZWYgQ09ORklHX1BDSQorCWdkLT5wY2lfY2xrID0gY2xraW47CisKKwlpZiAoc2NjciAmIFNDQ1JfUENJX01PREUpIHsKKwkJdWludCBwY2lfZGl2OworCQl1aW50IHBjaWRmID0gKHNjY3IgJiBTQ0NSX1BDSURGX01TSykgPj4gU0NDUl9QQ0lERl9TSElGVDsKKworCQlpZiAoc2NjciAmIFNDQ1JfUENJX01PRENLKSB7CisJCQlwY2lfZGl2ID0gMjsKKwkJCWlmIChwY2lkZiA9PSA5KSB7CisJCQkJcGNpX2RpdiAqPSA1OworCQkJfSBlbHNlIGlmIChwY2lkZiA9PSAweEIpIHsKKwkJCQlwY2lfZGl2ICo9IDY7CisJCQl9IGVsc2UgeworCQkJCXBjaV9kaXYgKj0gKHBjaWRmICsgMSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlwY2lfZGl2ID0gcGNpZGYgKyAxOworCQl9CisKKwkJZ2QtPnBjaV9jbGsgPSAoZ2QtPmNwbV9jbGsgKiAyKSAvIHBjaV9kaXY7CisJfQorI2VuZGlmCisKKwlyZXR1cm4gKDApOworfQorCitpbnQgcHJ0XzgyNjBfY2xrcyAodm9pZCkKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1hcCA9IChpbW1hcF90ICopIENPTkZJR19TWVNfSU1NUjsKKwl1bG9uZyBzY2NyLCBkZmJyZzsKKwl1bG9uZyBzY21yLCBjb3JlY25mLCBidXNkZiwgY3BtZGYsIHBsbGRmLCBwbGxtZiwgcGNpZGY7CisJY29yZWNuZl90ICpjcDsKKworCXNjY3IgPSBpbW1hcC0+aW1fY2xrcnN0LmNhcl9zY2NyOworCWRmYnJnID0gKHNjY3IgJiBTQ0NSX0RGQlJHX01TSykgPj4gU0NDUl9ERkJSR19TSElGVDsKKworCXNjbXIgPSBpbW1hcC0+aW1fY2xrcnN0LmNhcl9zY21yOworCWNvcmVjbmYgPSAoc2NtciAmIFNDTVJfQ09SRUNORl9NU0spID4+IFNDTVJfQ09SRUNORl9TSElGVDsKKwlidXNkZiA9IChzY21yICYgU0NNUl9CVVNERl9NU0spID4+IFNDTVJfQlVTREZfU0hJRlQ7CisJY3BtZGYgPSAoc2NtciAmIFNDTVJfQ1BNREZfTVNLKSA+PiBTQ01SX0NQTURGX1NISUZUOworCXBsbGRmID0gKHNjbXIgJiBTQ01SX1BMTERGKSA/IDEgOiAwOworCXBsbG1mID0gKHNjbXIgJiBTQ01SX1BMTE1GX01TSykgPj4gU0NNUl9QTExNRl9TSElGVDsKKwlwY2lkZiA9IChzY2NyICYgU0NDUl9QQ0lERl9NU0spID4+IFNDQ1JfUENJREZfU0hJRlQ7CisKKwljcCA9ICZjb3JlY25mX3RhYltjb3JlY25mXTsKKworCXB1dHMgKENQVV9JRF9TVFIgIiBDbG9jayBDb25maWd1cmF0aW9uXG4gLSBCdXMtdG8tQ29yZSBNdWx0ICIpOworCisJc3dpdGNoIChjcC0+YjJjX211bHQpIHsKKwljYXNlIF9ieXA6CisJCXB1dHMgKCJCWVBBU1MiKTsKKwkJYnJlYWs7CisKKwljYXNlIF9vZmY6CisJCXB1dHMgKCJPRkYiKTsKKwkJYnJlYWs7CisKKwljYXNlIF91bms6CisJCXB1dHMgKCJVTktOT1dOIik7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcHJpbnRmICgiJWQlc3giLAorCQkJY3AtPmIyY19tdWx0IC8gMiwKKwkJCShjcC0+YjJjX211bHQgJSAyKSA/ICIuNSIgOiAiIik7CisJCWJyZWFrOworCX0KKworCXByaW50ZiAoIiwgVkNPIERpdiAlZCwgNjB4IEJ1cyBGcmVxICVzLCBDb3JlIEZyZXEgJXNcbiIsCisJCQljcC0+dmNvX2RpdiwgY3AtPmZyZXFfNjB4LCBjcC0+ZnJlcV9jb3JlKTsKKworCXByaW50ZiAoIiAtIGRmYnJnICVsZCwgY29yZWNuZiAweCUwMmx4LCBidXNkZiAlbGQsIGNwbWRmICVsZCwgIgorCQkicGxsZGYgJWxkLCBwbGxtZiAlbGQsIHBjaWRmICVsZFxuIiwKKwkJCWRmYnJnLCBjb3JlY25mLCBidXNkZiwgY3BtZGYsCisJCQlwbGxkZiwgcGxsbWYsIHBjaWRmKTsKKworCXByaW50ZiAoIiAtIHZjb19vdXQgJTEwbGQsIHNjY19jbGsgJTEwbGQsIGJyZ19jbGsgJTEwbGRcbiIsCisJCQlnZC0+dmNvX291dCwgZ2QtPnNjY19jbGssIGdkLT5icmdfY2xrKTsKKworCXByaW50ZiAoIiAtIGNwdV9jbGsgJTEwbGQsIGNwbV9jbGsgJTEwbGQsIGJ1c19jbGsgJTEwbGRcbiIsCisJCQlnZC0+Y3B1X2NsaywgZ2QtPmNwbV9jbGssIGdkLT5idXNfY2xrKTsKKyNpZmRlZiBDT05GSUdfUENJCisJcHJpbnRmICgiIC0gcGNpX2NsayAlMTBsZFxuIiwgZ2QtPnBjaV9jbGspOworI2VuZGlmCisJcHV0YyAoJ1xuJyk7CisKKwlyZXR1cm4gKDApOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjYwL3NwZWVkLmggYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgyNjAvc3BlZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjMyYTE0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjYwL3NwZWVkLmgKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMAorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBUaW1lciB2YWx1ZSBmb3IgdGltZXIgMiwgSUNMSyA9IDEwCisgKgorICogU1BFRURfRkNPVU5UMiA9ICBHQ0xLIC8gKDE2ICogKFRJTUVSX1RNUl9QUyArIDEpKQorICogU1BFRURfVE1SM19QUyA9IChHQ0xLIC8gKDE2ICogU1BFRURfRkNPVU5UMykpIC0gMQorICoKKyAqIFNQRUVEX0ZDT1VOVDIJdGltZXIgMiBjb3VudGluZyBmcmVxdWVuY3kKKyAqIEdDTEsJCQlDUFUgY2xvY2sKKyAqIFNQRUVEX1RNUjJfUFMJcHJlc2NhbGVyCisgKi8KKyNkZWZpbmUgU1BFRURfVE1SMl9QUwkoMjUwIC0gMSkJLyogZGl2aWRlIGJ5IDI1MAkqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBUaW1lciB2YWx1ZSBmb3IgUElUCisgKgorICogUElUX1RJTUUgPSBTUEVFRF9QSVRDIC8gUElUUlRDTEsKKyAqIFBJVFJUQ0xLID0gODE5MgorICovCisjZGVmaW5lIFNQRUVEX1BJVEMJKDgyIDw8IDE2KQkvKiBzdGFydCBjb3VudGluZyBmcm9tIDgyCSovCisKKy8qCisgKiBUaGUgbmV3IHZhbHVlIGZvciBQVEEgaXMgY2FsY3VsYXRlZCBmcm9tCisgKgorICoJUFRBID0gKGdjbGsgKiBUcmVmcmVzaCkgLyAoMiBeICgyICogREZCUkcpICogUFRQICogTkNTKQorICoKKyAqIGdjbGsJCUNQVSBjbG9jayAobm90IGJ1cyBjbG9jayAhKQorICogVHJlZnJlc2gJUmVmcmVzaCBjeWNsZSAqIDQgKGZvdXIgd29yZCBidXJzdHMgdXNlZCkKKyAqIERGQlJHCUZvciBub3JtYWwgbW9kZSAobm8gY2xvY2sgcmVkdWN0aW9uKSBhbHdheXMgMAorICogUFRQCQlQcmVzY2FsZXIgKGFscmVhZHkgYWRqdXN0ZWQgZm9yIG5vLiBvZiBiYW5rcyBhbmQgNEsgLyA4SyByZWZyZXNoKQorICogTkNTCQlOdW1iZXIgb2YgU0RSQU0gYmFua3MgKGNoaXAgc2VsZWN0cykgb24gdGhpcyBVUE0uCisgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI2MC9zcGkuYyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI2MC9zcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWQyYWMzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjYwL3NwaS5jCkBAIC0wLDAgKzEsNDM1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAxIE5hdmluIEJvcHB1cmkgLyBQcmFzaGFudCBQYXRlbAorICoJPG5ib3BwdXJpQHRyaW5ldGNvbW11bmljYXRpb24uY29tPiwKKyAqCTxwbXBhdGVsQHRyaW5ldGNvbW11bmljYXRpb24uY29tPgorICogQ29weXJpZ2h0IChjKSAyMDAxIEdlcmQgTWVubmNoZW4gPEdlcmQuTWVubmNoZW5AaWNuLnNpZW1lbnMuZGU+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCA8d2RAZGVueC5kZT4uCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyoKKyAqIE1QQzgyNjAgQ1BNIFNQSSBpbnRlcmZhY2UuCisgKgorICogUGFydHMgb2YgdGhpcyBjb2RlIGFyZSBwcm9iYWJseSBub3QgcG9ydGFibGUgYW5kL29yIHNwZWNpZmljIHRvCisgKiB0aGUgYm9hcmQgd2hpY2ggSSB1c2VkIGZvciB0aGUgdGVzdHMuIFBsZWFzZSBzZW5kIGZpeGVzL2NvbXBsYWludHMKKyAqIHRvIHdkQGRlbnguZGUKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGFzbS9jcG1fODI2MC5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bWFsbG9jLmg+CisjaW5jbHVkZSA8cG9zdC5oPgorI2luY2x1ZGUgPG5ldC5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfU1BJKQorCisvKiBXYXJuaW5nOgorICogWW91IGNhbm5vdCBlbmFibGUgREVCVUcgZm9yIGVhcmx5IHN5c3RlbSBpbml0YWxpemF0aW9uLCBpLiBlLiB3aGVuCisgKiB0aGlzIGRyaXZlciBpcyB1c2VkIHRvIHJlYWQgZW52aXJvbm1lbnQgcGFyYW1ldGVycyBsaWtlICJiYXVkcmF0ZSIKKyAqIGZyb20gRUVQUk9NIHdoaWNoIGFyZSB1c2VkIHRvIGluaXRpYWxpemUgdGhlIHNlcmlhbCBwb3J0IHdoaWNoIGlzCisgKiBuZWVkZWQgdG8gcHJpbnQgdGhlIGRlYnVnIG1lc3NhZ2VzLi4uCisgKi8KKyN1bmRlZglERUJVRworCisjZGVmaW5lIFNQSV9FRVBST01fV1JFTgkJMHgwNgorI2RlZmluZSBTUElfRUVQUk9NX1JEU1IJCTB4MDUKKyNkZWZpbmUgU1BJX0VFUFJPTV9SRUFECQkweDAzCisjZGVmaW5lIFNQSV9FRVBST01fV1JJVEUJMHgwMgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIE9mZnNldCBmb3IgaW5pdGlhbCBTUEkgYnVmZmVycyBpbiBEUFJBTToKKyAqIFdlIG5lZWQgYSA1MjAgYnl0ZSBzY3JhdGNoIERQUkFNIGFyZWEgdG8gdXNlIGF0IGFuIGVhcmx5IHN0YWdlLgorICogSXQgaXMgdXNlZCBiZXR3ZWVuIHRoZSB0d28gaW5pdGlhbGl6YXRpb24gY2FsbHMgKHNwaV9pbml0X2YoKQorICogYW5kIHNwaV9pbml0X3IoKSkuCisgKiBUaGUgdmFsdWUgMHgyMDAwIG1ha2VzIGl0IGZhciBlbm91Z2ggZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGRhdGEKKyAqIGFyZWEgKGFzIHdlbGwgYXMgZnJvbSB0aGUgc3RhY2sgcG9pbnRlcikuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNpZm5kZWYJQ09ORklHX1NZU19TUElfSU5JVF9PRkZTRVQKKyNkZWZpbmUJQ09ORklHX1NZU19TUElfSU5JVF9PRkZTRVQJMHgyMDAwCisjZW5kaWYKKworI2RlZmluZSBDUE1fU1BJX0JBU0UgMHgxMDAKKworI2lmZGVmCURFQlVHCisKKyNkZWZpbmUJRFBSSU5UKGEpCXByaW50ZiBhOworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEhlbHBlciBmdW5jdGlvbnMgdG8gcGVlayBpbnRvIHR4IGFuZCByeCBidWZmZXJzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBoZXhfZGlnaXQgPSAiMDEyMzQ1Njc4OUFCQ0RFRiI7CisKK3N0YXRpYyBjaGFyIHF1aWNraGV4IChpbnQgaSkKK3sKKwlyZXR1cm4gaGV4X2RpZ2l0W2ldOworfQorCitzdGF0aWMgdm9pZCBtZW1kdW1wICh2b2lkICpwdiwgaW50IG51bSkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBjaGFyICpwYyA9ICh1bnNpZ25lZCBjaGFyICopIHB2OworCisJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKQorCQlwcmludGYgKCIlYyVjICIsIHF1aWNraGV4IChwY1tpXSA+PiA0KSwgcXVpY2toZXggKHBjW2ldICYgMHgwZikpOworCXByaW50ZiAoIlx0Iik7CisJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKQorCQlwcmludGYgKCIlYyIsIGlzcHJpbnQgKHBjW2ldKSA/IHBjW2ldIDogJy4nKTsKKwlwcmludGYgKCJcbiIpOworfQorI2Vsc2UJLyogIURFQlVHICovCisKKyNkZWZpbmUJRFBSSU5UKGEpCisKKyNlbmRpZgkvKiBERUJVRyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGdW5jdGlvbiBwcm90b3R5cGVzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tICovCit2b2lkIHNwaV9pbml0ICh2b2lkKTsKKworc3NpemVfdCBzcGlfcmVhZCAodWNoYXIgKiwgaW50LCB1Y2hhciAqLCBpbnQpOworc3NpemVfdCBzcGlfd3JpdGUgKHVjaGFyICosIGludCwgdWNoYXIgKiwgaW50KTsKK3NzaXplX3Qgc3BpX3hmZXIgKHNpemVfdCk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFZhcmlhYmxlcworICogLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIE1BWF9CVUZGRVIJMHgxMDQKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSW5pdGlhbGx5IHdlIHBsYWNlIHRoZSBSWCBhbmQgVFggYnVmZmVycyBhdCBhIGZpeGVkIGxvY2F0aW9uIGluIERQUkFNIQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIHVjaGFyICpyeGJ1ZiA9CisgICh1Y2hhciAqKSYoKGltbWFwX3QgKilDT05GSUdfU1lTX0lNTVIpLT5pbV9kcHJhbWJhc2UKKwkJCVtDT05GSUdfU1lTX1NQSV9JTklUX09GRlNFVF07CitzdGF0aWMgdWNoYXIgKnR4YnVmID0KKyAgKHVjaGFyICopJigoaW1tYXBfdCAqKUNPTkZJR19TWVNfSU1NUiktPmltX2RwcmFtYmFzZQorCQkJW0NPTkZJR19TWVNfU1BJX0lOSVRfT0ZGU0VUK01BWF9CVUZGRVJdOworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICBGdW5jdGlvbjogICAgc3BpX2luaXRfZgorICoKKyAqICBEZXNjcmlwdGlvbjogSW5pdCBTUEktQ29udHJvbGxlciAoUk9NIHBhcnQpCisgKgorICogIHJldHVybjogICAgICAtLS0KKyAqCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwordm9pZCBzcGlfaW5pdF9mICh2b2lkKQoreworCXVuc2lnbmVkIGludCBkcGFkZHI7CisKKwl2b2xhdGlsZSBzcGlfdCAqc3BpOworCXZvbGF0aWxlIGltbWFwX3QgKmltbXI7CisJdm9sYXRpbGUgY3BtODI2MF90ICpjcDsKKwl2b2xhdGlsZSBjYmRfdCAqdGJkZiwgKnJiZGY7CisKKwlpbW1yID0gKGltbWFwX3QgKikgIENPTkZJR19TWVNfSU1NUjsKKwljcCAgID0gKGNwbTgyNjBfdCAqKSAmaW1tci0+aW1fY3BtOworCisJKih1c2hvcnQgKikoJmltbXItPmltX2RwcmFtYmFzZVtQUk9GRl9TUElfQkFTRV0pID0gUFJPRkZfU1BJOworCXNwaSAgPSAoc3BpX3QgKikmaW1tci0+aW1fZHByYW1iYXNlW1BST0ZGX1NQSV07CisKKy8qIDEgKi8KKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKiBJbml0aWFsaXplIFBvcnQgRCBTUEkgcGlucworCSAqICh3ZSBhcmUgb25seSBpbiBNYXN0ZXIgTW9kZSAhKQorCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKiBHUElPIG9yIHBlci4gRnVuY3Rpb24KKwkgKiBQUEFSRFsxNl0gPSAxIFsweDAwMDA4MDAwXSAoU1BJTUlTTykKKwkgKiBQUEFSRFsxN10gPSAxIFsweDAwMDA0MDAwXSAoU1BJTU9TSSkKKwkgKiBQUEFSRFsxOF0gPSAxIFsweDAwMDAyMDAwXSAoU1BJQ0xLKQorCSAqIFBQQVJEWzEyXSA9IDAgWzB4MDAwODAwMDBdIC0+IEdQSU86IChDUyBmb3IgQVRDIEVFUFJPTSkKKwkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCWltbXItPmltX2lvcG9ydC5pb3BfcHBhcmQgfD0gIDB4MDAwMEUwMDA7CS8qIHNldCAgYml0cwkqLworCWltbXItPmltX2lvcG9ydC5pb3BfcHBhcmQgJj0gfjB4MDAwODAwMDA7CS8qIHJlc2V0IGJpdAkqLworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqIEluL091dCBvciBwZXIuIEZ1bmN0aW9uIDAvMQorCSAqIFBESVJEWzE2XSA9IDAgWzB4MDAwMDgwMDBdIC0+IFBFUkkxOiBTUElNSVNPCisJICogUERJUkRbMTddID0gMCBbMHgwMDAwNDAwMF0gLT4gUEVSSTE6IFNQSU1PU0kKKwkgKiBQRElSRFsxOF0gPSAwIFsweDAwMDAyMDAwXSAtPiBQRVJJMTogU1BJQ0xLCisJICogUERJUkRbMTJdID0gMSBbMHgwMDA4MDAwMF0gLT4gR1BJTyBPVVQ6IENTIGZvciBBVEMgRUVQUk9NCisJICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCWltbXItPmltX2lvcG9ydC5pb3BfcGRpcmQgJj0gfjB4MDAwMEUwMDA7CisJaW1tci0+aW1faW9wb3J0LmlvcF9wZGlyZCB8PSAweDAwMDgwMDAwOworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqIHNwZWNpYWwgb3B0aW9uIHJlZy4KKwkgKiBQU09SRFsxNl0gPSAxIFsweDAwMDA4MDAwXSAtPiBTUElNSVNPCisJICogUFNPUkRbMTddID0gMSBbMHgwMDAwNDAwMF0gLT4gU1BJTU9TSQorCSAqIFBTT1JEWzE4XSA9IDEgWzB4MDAwMDIwMDBdIC0+IFNQSUNMSworCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwlpbW1yLT5pbV9pb3BvcnQuaW9wX3Bzb3JkIHw9IDB4MDAwMEUwMDA7CisKKwkvKiBJbml0aWFsaXplIHRoZSBwYXJhbWV0ZXIgcmFtLgorCSAqIFdlIG5lZWQgdG8gbWFrZSBzdXJlIG1hbnkgdGhpbmdzIGFyZSBpbml0aWFsaXplZCB0byB6ZXJvCisJICovCisJc3BpLT5zcGlfcnN0YXRlCT0gMDsKKwlzcGktPnNwaV9yZHAJPSAwOworCXNwaS0+c3BpX3JicHRyCT0gMDsKKwlzcGktPnNwaV9yYmMJPSAwOworCXNwaS0+c3BpX3J4dG1wCT0gMDsKKwlzcGktPnNwaV90c3RhdGUJPSAwOworCXNwaS0+c3BpX3RkcAk9IDA7CisJc3BpLT5zcGlfdGJwdHIJPSAwOworCXNwaS0+c3BpX3RiYwk9IDA7CisJc3BpLT5zcGlfdHh0bXAJPSAwOworCisJLyogQWxsb2NhdGUgc3BhY2UgZm9yIG9uZSB0cmFuc21pdCBhbmQgb25lIHJlY2VpdmUgYnVmZmVyCisJICogZGVzY3JpcHRvciBpbiB0aGUgRFAgcmFtCisJICovCisjaWZkZWYgQ09ORklHX1NZU19BTExPQ19EUFJBTQorCWRwYWRkciA9IG04MjYwX2NwbV9kcGFsbG9jIChzaXplb2YoY2JkX3QpKjIsIDgpOworI2Vsc2UKKwlkcGFkZHIgPSBDUE1fU1BJX0JBU0U7CisjZW5kaWYKKworLyogMyAqLworCS8qIFNldCB1cCB0aGUgU1BJIHBhcmFtZXRlcnMgaW4gdGhlIHBhcmFtZXRlciByYW0gKi8KKwlzcGktPnNwaV9yYmFzZSA9IGRwYWRkcjsKKwlzcGktPnNwaV90YmFzZSA9IGRwYWRkciArIHNpemVvZiAoY2JkX3QpOworCisJLyoqKioqKioqKioqSU1QT1JUQU5UKioqKioqKioqKioqKioqKioqLworCisJLyoKKwkgKiBTZXR0aW5nIHRyYW5zbWl0IGFuZCByZWNlaXZlIGJ1ZmZlciBkZXNjcmlwdG9yIHBvaW50ZXJzCisJICogaW5pdGlhbGx5IHRvIHJiYXNlIGFuZCB0YmFzZS4gT25seSB0aGUgbWljcm9jb2RlIHBhdGNoZXMKKwkgKiBkb2N1bWVudGF0aW9uIHRhbGtzIGFib3V0IGluaXRpYWxpemluZyB0aGlzIHBvaW50ZXIuIFRoaXMKKwkgKiBpcyBtaXNzaW5nIGZyb20gdGhlIHNhbXBsZSBJMkMgZHJpdmVyLiBJZiB5b3UgZG9udAorCSAqIGluaXRpYWxpemUgdGhlc2UgcG9pbnRlcnMsIHRoZSBrZXJuZWwgaGFuZ3MuCisJICovCisJc3BpLT5zcGlfcmJwdHIgPSBzcGktPnNwaV9yYmFzZTsKKwlzcGktPnNwaV90YnB0ciA9IHNwaS0+c3BpX3RiYXNlOworCisvKiA0ICovCisJLyogSW5pdCBTUEkgVHggKyBSeCBQYXJhbWV0ZXJzICovCisJd2hpbGUgKGNwLT5jcF9jcGNyICYgQ1BNX0NSX0ZMRykKKwkJOworCWNwLT5jcF9jcGNyID0gbWtfY3JfY21kKENQTV9DUl9TUElfUEFHRSwgQ1BNX0NSX1NQSV9TQkxPQ0ssCisJCQkJCQkJMCwgQ1BNX0NSX0lOSVRfVFJYKSB8IENQTV9DUl9GTEc7CisJd2hpbGUgKGNwLT5jcF9jcGNyICYgQ1BNX0NSX0ZMRykKKwkJOworCisvKiA2ICovCisJLyogU2V0IHRvIGJpZyBlbmRpYW4uICovCisJc3BpLT5zcGlfdGZjciA9IENQTUZDUl9FQjsKKwlzcGktPnNwaV9yZmNyID0gQ1BNRkNSX0VCOworCisvKiA3ICovCisJLyogU2V0IG1heGltdW0gcmVjZWl2ZSBzaXplLiAqLworCXNwaS0+c3BpX21yYmxyID0gTUFYX0JVRkZFUjsKKworLyogOCArIDkgKi8KKwkvKiB0eCBhbmQgcnggYnVmZmVyIGRlc2NyaXB0b3JzICovCisJdGJkZiA9IChjYmRfdCAqKSAmIGltbXItPmltX2RwcmFtYmFzZVtzcGktPnNwaV90YmFzZV07CisJcmJkZiA9IChjYmRfdCAqKSAmIGltbXItPmltX2RwcmFtYmFzZVtzcGktPnNwaV9yYmFzZV07CisKKwl0YmRmLT5jYmRfc2MgJj0gfkJEX1NDX1JFQURZOworCXJiZGYtPmNiZF9zYyAmPSB+QkRfU0NfRU1QVFk7CisKKwkvKiBTZXQgdGhlIGJkJ3MgcnggYW5kIHR4IGJ1ZmZlciBhZGRyZXNzIHBvaW50ZXJzICovCisJcmJkZi0+Y2JkX2J1ZmFkZHIgPSAodWxvbmcpIHJ4YnVmOworCXRiZGYtPmNiZF9idWZhZGRyID0gKHVsb25nKSB0eGJ1ZjsKKworLyogMTAgKyAxMSAqLworCWltbXItPmltX3NwaS5zcGlfc3BpZSA9IFNQSV9FTUFTSzsJCS8qIENsZWFyIGFsbCBTUEkgZXZlbnRzCSovCisJaW1tci0+aW1fc3BpLnNwaV9zcGltID0gMHgwMDsJCQkvKiBNYXNrICBhbGwgU1BJIGV2ZW50cyAqLworCisKKwlyZXR1cm47Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogIEZ1bmN0aW9uOiAgICBzcGlfaW5pdF9yCisgKgorICogIERlc2NyaXB0aW9uOiBJbml0IFNQSS1Db250cm9sbGVyIChSQU0gcGFydCkgLQorICoJCSBUaGUgbWFsbG9jIGVuZ2luZSBpcyByZWFkeSBhbmQgd2UgY2FuIG1vdmUgb3VyIGJ1ZmZlcnMgdG8KKyAqCQkgbm9ybWFsIFJBTQorICoKKyAqICByZXR1cm46ICAgICAgLS0tCisgKgorICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KK3ZvaWQgc3BpX2luaXRfciAodm9pZCkKK3sKKwl2b2xhdGlsZSBzcGlfdCAqc3BpOworCXZvbGF0aWxlIGltbWFwX3QgKmltbXI7CisJdm9sYXRpbGUgY3BtODI2MF90ICpjcDsKKwl2b2xhdGlsZSBjYmRfdCAqdGJkZiwgKnJiZGY7CisKKwlpbW1yID0gKGltbWFwX3QgKikgIENPTkZJR19TWVNfSU1NUjsKKwljcCAgID0gKGNwbTgyNjBfdCAqKSAmaW1tci0+aW1fY3BtOworCisJc3BpICA9IChzcGlfdCAqKSZpbW1yLT5pbV9kcHJhbWJhc2VbUFJPRkZfU1BJXTsKKworCS8qIHR4IGFuZCByeCBidWZmZXIgZGVzY3JpcHRvcnMgKi8KKwl0YmRmID0gKGNiZF90ICopICYgaW1tci0+aW1fZHByYW1iYXNlW3NwaS0+c3BpX3RiYXNlXTsKKwlyYmRmID0gKGNiZF90ICopICYgaW1tci0+aW1fZHByYW1iYXNlW3NwaS0+c3BpX3JiYXNlXTsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgUlggYW5kIFRYIGJ1ZmZlcnMgKi8KKwlyeGJ1ZiA9ICh1Y2hhciAqKSBtYWxsb2MgKE1BWF9CVUZGRVIpOworCXR4YnVmID0gKHVjaGFyICopIG1hbGxvYyAoTUFYX0JVRkZFUik7CisKKwlyYmRmLT5jYmRfYnVmYWRkciA9ICh1bG9uZykgcnhidWY7CisJdGJkZi0+Y2JkX2J1ZmFkZHIgPSAodWxvbmcpIHR4YnVmOworCisJcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIEZ1bmN0aW9uOiAgICBzcGlfd3JpdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCitzc2l6ZV90IHNwaV93cml0ZSAodWNoYXIgKmFkZHIsIGludCBhbGVuLCB1Y2hhciAqYnVmZmVyLCBpbnQgbGVuKQoreworCWludCBpOworCisJbWVtc2V0KHJ4YnVmLCAwLCBNQVhfQlVGRkVSKTsKKwltZW1zZXQodHhidWYsIDAsIE1BWF9CVUZGRVIpOworCSp0eGJ1ZiA9IFNQSV9FRVBST01fV1JFTjsJCS8qIHdyaXRlIGVuYWJsZQkJKi8KKwlzcGlfeGZlcigxKTsKKwltZW1jcHkodHhidWYsIGFkZHIsIGFsZW4pOworCSp0eGJ1ZiA9IFNQSV9FRVBST01fV1JJVEU7CQkvKiBXUklURSBtZW1vcnkgYXJyYXkJKi8KKwltZW1jcHkoYWxlbiArIHR4YnVmLCBidWZmZXIsIGxlbik7CisJc3BpX3hmZXIoYWxlbiArIGxlbik7CisJCQkJCQkvKiBpZ25vcmUgcmVjZWl2ZWQgZGF0YQkqLworCWZvciAoaSA9IDA7IGkgPCAxMDAwOyBpKyspIHsKKwkJKnR4YnVmID0gU1BJX0VFUFJPTV9SRFNSOwkvKiByZWFkIHN0YXR1cwkJKi8KKwkJdHhidWZbMV0gPSAwOworCQlzcGlfeGZlcigyKTsKKwkJaWYgKCEocnhidWZbMV0gJiAxKSkgeworCQkJYnJlYWs7CisJCX0KKwkJdWRlbGF5KDEwMDApOworCX0KKwlpZiAoaSA+PSAxMDAwKSB7CisJCXByaW50ZiAoIioqKiBzcGlfd3JpdGU6IFRpbWUgb3V0IHdoaWxlIHdyaXRpbmchXG4iKTsKKwl9CisKKwlyZXR1cm4gbGVuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIEZ1bmN0aW9uOiAgICBzcGlfcmVhZAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KK3NzaXplX3Qgc3BpX3JlYWQgKHVjaGFyICphZGRyLCBpbnQgYWxlbiwgdWNoYXIgKmJ1ZmZlciwgaW50IGxlbikKK3sKKwltZW1zZXQocnhidWYsIDAsIE1BWF9CVUZGRVIpOworCW1lbXNldCh0eGJ1ZiwgMCwgTUFYX0JVRkZFUik7CisJbWVtY3B5KHR4YnVmLCBhZGRyLCBhbGVuKTsKKwkqdHhidWYgPSBTUElfRUVQUk9NX1JFQUQ7CQkvKiBSRUFEIG1lbW9yeSBhcnJheQkqLworCisJLyoKKwkgKiBUaGVyZSBpcyBhIGJ1ZyBpbiA4NjBUICg/KSB0aGF0IGN1dHMgdGhlIGxhc3QgYnl0ZSBvZiBpbnB1dAorCSAqIGlmIHdlJ3JlIHJlYWRpbmcgaW50byBEUFJBTS4gVGhlIHNvbHV0aW9uIHdlIGNob29zZSBoZXJlIGlzCisJICogdG8gYWx3YXlzIHJlYWQgbGVuKzEgYnl0ZXMgKHdlIGhhdmUgb25lIGV4dHJhIGJ5dGUgYXQgdGhlCisJICogZW5kIG9mIHRoZSBidWZmZXIpLgorCSAqLworCXNwaV94ZmVyKGFsZW4gKyBsZW4gKyAxKTsKKwltZW1jcHkoYnVmZmVyLCBhbGVuICsgcnhidWYsIGxlbik7CisKKwlyZXR1cm4gbGVuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIEZ1bmN0aW9uOiAgICBzcGlfeGZlcgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KK3NzaXplX3Qgc3BpX3hmZXIgKHNpemVfdCBjb3VudCkKK3sKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1yOworCXZvbGF0aWxlIGNwbTgyNjBfdCAqY3A7CisJdm9sYXRpbGUgc3BpX3QgKnNwaTsKKwljYmRfdCAqdGJkZiwgKnJiZGY7CisJaW50IHRtOworCisJRFBSSU5UICgoIioqKiBzcGlfeGZlciBlbnRlcmVkICoqKlxuIikpOworCisJaW1tciA9IChpbW1hcF90ICopIENPTkZJR19TWVNfSU1NUjsKKwljcCAgID0gKGNwbTgyNjBfdCAqKSAmaW1tci0+aW1fY3BtOworCisJc3BpICA9IChzcGlfdCAqKSZpbW1yLT5pbV9kcHJhbWJhc2VbUFJPRkZfU1BJXTsKKworCXRiZGYgPSAoY2JkX3QgKikgJiBpbW1yLT5pbV9kcHJhbWJhc2Vbc3BpLT5zcGlfdGJhc2VdOworCXJiZGYgPSAoY2JkX3QgKikgJiBpbW1yLT5pbV9kcHJhbWJhc2Vbc3BpLT5zcGlfcmJhc2VdOworCisJLyogQm9hcmQtc3BlY2lmaWM6IFNldCBDUyBmb3IgZGV2aWNlIChBVEMgRUVQUk9NKSAqLworCWltbXItPmltX2lvcG9ydC5pb3BfcGRhdGQgJj0gfjB4MDAwODAwMDA7CisKKwkvKiBTZXR0aW5nIHR4IGJkIHN0YXR1cyBhbmQgZGF0YSBsZW5ndGggKi8KKwl0YmRmLT5jYmRfc2MgID0gQkRfU0NfUkVBRFkgfCBCRF9TQ19MQVNUIHwgQkRfU0NfV1JBUDsKKwl0YmRmLT5jYmRfZGF0bGVuID0gY291bnQ7CisKKwlEUFJJTlQgKCgiKioqIHNwaV94ZmVyOiBCeXRlcyB0byBiZSB4ZmVycmVkOiAlZCAqKipcbiIsCisJCQkJCQkJdGJkZi0+Y2JkX2RhdGxlbikpOworCisJLyogU2V0dGluZyByeCBiZCBzdGF0dXMgYW5kIGRhdGEgbGVuZ3RoICovCisJcmJkZi0+Y2JkX3NjID0gQkRfU0NfRU1QVFkgfCBCRF9TQ19XUkFQOworCXJiZGYtPmNiZF9kYXRsZW4gPSAwOwkgLyogcnggbGVuZ3RoIGhhcyBubyBzaWduaWZpY2FuY2UgKi8KKworCWltbXItPmltX3NwaS5zcGlfc3Btb2RlID0gU1BNT0RFX1JFVgl8CisJCQlTUE1PREVfTVNUUgl8CisJCQlTUE1PREVfRU4JfAorCQkJU1BNT0RFX0xFTig4KQl8CS8qIDggQml0cyBwZXIgY2hhciAqLworCQkJU1BNT0RFX1BNKDB4OCkgOwkvKiBtZWRpdW0gc3BlZWQgKi8KKwlpbW1yLT5pbV9zcGkuc3BpX3NwaWUgPSBTUElfRU1BU0s7CQkvKiBDbGVhciBhbGwgU1BJIGV2ZW50cwkqLworCWltbXItPmltX3NwaS5zcGlfc3BpbSA9IDB4MDA7CQkJLyogTWFzayAgYWxsIFNQSSBldmVudHMgKi8KKworCS8qIHN0YXJ0IHNwaSB0cmFuc2ZlciAqLworCURQUklOVCAoKCIqKiogc3BpX3hmZXI6IFBlcmZvcm1pbmcgdHJhbnNmZXIgLi4uXG4iKSk7CisJaW1tci0+aW1fc3BpLnNwaV9zcGNvbSB8PSBTUElfU1RSOwkJLyogU3RhcnQgdHJhbnNtaXQgKi8KKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogV2FpdCBmb3IgU1BJIHRyYW5zbWl0IHRvIGdldCBvdXQKKwkgKiBvciB0aW1lIG91dCAoMSBzZWNvbmQgPSAxMDAwIG1zKQorCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJZm9yICh0bT0wOyB0bTwxMDAwOyArK3RtKSB7CisJCWlmIChpbW1yLT5pbV9zcGkuc3BpX3NwaWUgJiBTUElfVFhCKSB7CS8qIFR4IEJ1ZmZlciBFbXB0eSAqLworCQkJRFBSSU5UICgoIioqKiBzcGlfeGZlcjogVHggYnVmZmVyIGVtcHR5XG4iKSk7CisJCQlicmVhazsKKwkJfQorCQlpZiAoKHRiZGYtPmNiZF9zYyAmIEJEX1NDX1JFQURZKSA9PSAwKSB7CisJCQlEUFJJTlQgKCgiKioqIHNwaV94ZmVyOiBUeCBCRCBkb25lXG4iKSk7CisJCQlicmVhazsKKwkJfQorCQl1ZGVsYXkgKDEwMDApOworCX0KKwlpZiAodG0gPj0gMTAwMCkgeworCQlwcmludGYgKCIqKiogc3BpX3hmZXI6IFRpbWUgb3V0IHdoaWxlIHhmZXJyaW5nIHRvL2Zyb20gU1BJIVxuIik7CisJfQorCURQUklOVCAoKCIqKiogc3BpX3hmZXI6IC4uLiB0cmFuc2ZlciBlbmRlZFxuIikpOworCisjaWZkZWYJREVCVUcKKwlwcmludGYgKCJcbnNwaV94ZmVyOiB0eGJ1ZiBhZnRlciB4ZmVyXG4iKTsKKwltZW1kdW1wICgodm9pZCAqKSB0eGJ1ZiwgMTYpOwkvKiBkdW1wIG9mIHR4YnVmIGJlZm9yZSB0cmFuc21pdCAqLworCXByaW50ZiAoInNwaV94ZmVyOiByeGJ1ZiBhZnRlciB4ZmVyXG4iKTsKKwltZW1kdW1wICgodm9pZCAqKSByeGJ1ZiwgMTYpOwkvKiBkdW1wIG9mIHJ4YnVmIGFmdGVyIHRyYW5zbWl0ICovCisJcHJpbnRmICgiXG4iKTsKKyNlbmRpZgorCisJLyogQ2xlYXIgQ1MgZm9yIGRldmljZSAqLworCWltbXItPmltX2lvcG9ydC5pb3BfcGRhdGQgfD0gMHgwMDA4MDAwMDsKKworCXJldHVybiBjb3VudDsKK30KKyNlbmRpZgkvKiBDT05GSUdfU1BJICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzgyNjAvc3RhcnQuUyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI2MC9zdGFydC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MzUwNDIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgyNjAvc3RhcnQuUwpAQCAtMCwwICsxLDEwMjMgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAxOTk4CURhbiBNYWxlayA8ZG1hbGVrQGpsYy5uZXQ+CisgKiAgQ29weXJpZ2h0IChDKSAxOTk5CU1hZ251cyBEYW1tIDxraWVyYXlwYzAxLnAueS5raWUuZXJhLmVyaWNzc29uLnNlPgorICogIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSwyMDAyIFdvbGZnYW5nIERlbmsgPHdkQGRlbnguZGU+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyoKKyAqICBVLUJvb3QgLSBTdGFydHVwIENvZGUgZm9yIE1QQzgyNjAgUG93ZXJQQyBiYXNlZCBFbWJlZGRlZCBCb2FyZHMKKyAqLworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPG1wYzgyNjAuaD4KKyNpbmNsdWRlIDx0aW1lc3RhbXAuaD4KKyNpbmNsdWRlIDx2ZXJzaW9uLmg+CisKKyNkZWZpbmUgQ09ORklHXzgyNjAgMQkJLyogbmVlZGVkIGZvciBMaW51eCBrZXJuZWwgaGVhZGVyIGZpbGVzICovCisjZGVmaW5lIF9MSU5VWF9DT05GSUdfSCAxCS8qIGF2b2lkIHJlYWRpbmcgTGludXggYXV0b2NvbmYuaCBmaWxlCSovCisKKyNpbmNsdWRlIDxwcGNfYXNtLnRtcGw+CisjaW5jbHVkZSA8cHBjX2RlZnMuaD4KKworI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgorI2luY2x1ZGUgPGFzbS9tbXUuaD4KKworI2lmbmRlZiAgQ09ORklHX0lERU5UX1NUUklORworI2RlZmluZSAgQ09ORklHX0lERU5UX1NUUklORyAiIgorI2VuZGlmCisKKy8qIFdlIGRvbid0IHdhbnQgdGhlICBNTVUgeWV0LgorKi8KKyN1bmRlZglNU1JfS0VSTkVMCisvKiBGbG9hdGluZyBQb2ludCBlbmFibGUsIE1hY2hpbmUgQ2hlY2sgYW5kIFJlY292ZXJhYmxlIEludGVyci4gKi8KKyNpZmRlZiBERUJVRworI2RlZmluZSBNU1JfS0VSTkVMIChNU1JfRlB8TVNSX1JJKQorI2Vsc2UKKyNkZWZpbmUgTVNSX0tFUk5FTCAoTVNSX0ZQfE1TUl9NRXxNU1JfUkkpCisjZW5kaWYKKworLyoKKyAqIFNldCB1cCBHT1Q6IEdsb2JhbCBPZmZzZXQgVGFibGUKKyAqCisgKiBVc2UgcjEyIHRvIGFjY2VzcyB0aGUgR09UCisgKi8KKwlTVEFSVF9HT1QKKwlHT1RfRU5UUlkoX0dPVDJfVEFCTEVfKQorCUdPVF9FTlRSWShfRklYVVBfVEFCTEVfKQorCisJR09UX0VOVFJZKF9zdGFydCkKKwlHT1RfRU5UUlkoX3N0YXJ0X29mX3ZlY3RvcnMpCisJR09UX0VOVFJZKF9lbmRfb2ZfdmVjdG9ycykKKwlHT1RfRU5UUlkodHJhbnNmZXJfdG9faGFuZGxlcikKKworCUdPVF9FTlRSWShfX2luaXRfZW5kKQorCUdPVF9FTlRSWShfZW5kKQorCUdPVF9FTlRSWShfX2Jzc19zdGFydCkKKyNpZiBkZWZpbmVkKENPTkZJR19IWU1PRCkKKwlHT1RfRU5UUlkoZW52aXJvbm1lbnQpCisjZW5kaWYKKwlFTkRfR09UCisKKy8qCisgKiBWZXJzaW9uIHN0cmluZyAtIG11c3QgYmUgaW4gZGF0YSBzZWdtZW50IGJlY2F1c2UgTVBDODI2MCB1c2VzIHRoZSBmaXJzdAorICogMjU2IGJ5dGVzIGZvciB0aGUgSGFyZCBSZXNldCBDb25maWd1cmF0aW9uIFdvcmQgdGFibGUgKHNlZSBiZWxvdykuCisgKiBTaW1pbGFybHksIGNhbid0IGhhdmUgdGhlIFUtQm9vdCBNYWdpYyBOdW1iZXIgYXMgdGhlIGZpcnN0IHRoaW5nIGluCisgKiB0aGUgaW1hZ2UgLSBkb24ndCBrbm93IGhvdyB0aGlzIHdpbGwgYWZmZWN0IHRoZSBpbWFnZSB0b29scywgYnV0IEkgZ3Vlc3MKKyAqIEknbGwgZmluZCBvdXQgc29vbgorICovCisJLmRhdGEKKwkuZ2xvYmwJdmVyc2lvbl9zdHJpbmcKK3ZlcnNpb25fc3RyaW5nOgorCS5hc2NpaSBVX0JPT1RfVkVSU0lPTgorCS5hc2NpaSAiICgiLCBVX0JPT1RfREFURSwgIiAtICIsIFVfQk9PVF9USU1FLCAiKSIKKwkuYXNjaWkgQ09ORklHX0lERU5UX1NUUklORywgIlwwIgorCisvKgorICogIEhhcmQgUmVzZXQgQ29uZmlndXJhdGlvbiBXb3JkIChIUkNXKSB0YWJsZQorICoKKyAqICBUaGUgSGFyZCBSZXNldCBDb25maWd1cmF0aW9uIFdvcmQgKEhSQ1cpIHNldHMgYSBudW1iZXIgb2YgdXNlZnVsIHRoaW5ncworICogIHN1Y2ggYXMgd2hldGhlciB0aGVyZSBpcyBhbiBleHRlcm5hbCBtZW1vcnkgY29udHJvbGxlciwgd2hldGhlciB0aGUKKyAqICBQb3dlclBDIGNvcmUgaXMgZGlzYWJsZWQgKGkuZS4gb25seSB0aGUgY29tbXVuaWNhdGlvbnMgcHJvY2Vzc29yIGlzCisgKiAgYWN0aXZlLCBhY2Nlc3NlZCBieSBhbm90aGVyIENQVSBvbiB0aGUgYnVzKSwgd2hldGhlciB1c2luZyBleHRlcm5hbAorICogIGFyYml0cmF0aW9uLCBleHRlcm5hbCBidXMgbW9kZSwgYm9vdCBwb3J0IHNpemUsIGNvcmUgaW5pdGlhbCBwcmVmaXgsCisgKiAgaW50ZXJuYWwgc3BhY2UgYmFzZSwgYm9vdCBtZW1vcnkgc3BhY2UsIGV0Yy4KKyAqCisgKiAgVGhlc2UgdGhpbmdzIGRpY3RhdGUgd2hlcmUgdGhlIHByb2Nlc3NvciBiZWdpbnMgZXhlY3V0aW9uLCB3aGVyZSB0aGUKKyAqICBib290IFJPTSBhcHBlYXJzIGluIG1lbW9yeSwgdGhlIG1lbW9yeSBjb250cm9sbGVyIHNldHVwIHdoZW4gYWNjZXNzCisgKiAgYm9vdCBST00sIGV0Yy4gVGhlIEhSQ1cgaXMgKmV4dHJlbWVseSogaW1wb3J0YW50LgorICoKKyAqICBUaGUgSFJDVyBpcyByZWFkIGZyb20gdGhlIGJ1cyBkdXJpbmcgcmVzZXQuIE9uZSBDUFUgb24gdGhlIGJ1cyB3aWxsCisgKiAgYmUgYSBoYXJkIHJlc2V0IGNvbmZpZ3VyYXRpb24gbWFzdGVyLCBhbnkgb3RoZXJzIHdpbGwgYmUgaGFyZCByZXNldAorICogIGNvbmZpZ3VyYXRpb24gc2xhdmVzLiBUaGUgbWFzdGVyIHJlYWRzIGVpZ2h0IEhSQ1dzIGZyb20gZmxhc2ggZHVyaW5nCisgKiAgcmVzZXQgLSB0aGUgZmlyc3QgaXQgdXNlcyBmb3IgaXRzZWxmLCB0aGUgb3RoZXIgNyBpdCBjb21tdW5pY2F0ZXMgdG8KKyAqICB1cCB0byA3IGNvbmZpZ3VyYXRpb24gc2xhdmVzIGJ5IHNvbWUgY29tcGxpY2F0ZWQgbWVjaGFuaXNtLCB3aGljaCBpcworICogIG5vdCByZWFsbHkgaW1wb3J0YW50IGhlcmUuCisgKgorICogIFRoZSBjb25maWd1cmF0aW9uIG1hc3RlciBwZXJmb3JtcyAzMiBzdWNjZXNzaXZlIHJlYWRzIHN0YXJ0aW5nIGF0IGFkZHJlc3MKKyAqICAwIGFuZCBpbmNyZW1lbnRpbmcgYnkgOCBlYWNoIHJlYWQgKGkuZS4gb24gNjQgYml0IGJvdW5kYXJpZXMpIGJ1dCBvbmx5IDgKKyAqICBiaXRzIGlzIHJlYWQsIGFuZCBhbHdheXMgZnJvbSBieXRlIGxhbmUgRFswLTddIChzbyB0aGF0IHBvcnQgc2l6ZSBvZiB0aGUKKyAqICBib290IGRldmljZSBkb2VzIG5vdCBtYXR0ZXIpLiBUaGUgZmlyc3QgZm91ciByZWFkcyBmb3JtIHRoZSAzMiBiaXQgSFJDVworICogIGZvciB0aGUgbWFzdGVyIGl0c2VsZi4gVGhlIHNlY29uZCBmb3VyIHJlYWRzIGZvcm0gdGhlIEhSQ1cgZm9yIHRoZSBmaXJzdAorICogIHNsYXZlLCBhbmQgc28gb24sIHVwIHRvIHNldmVuIHNsYXZlcy4gVGhlIDMyIGJpdCBIUkNXIGlzIGZvcm1lZCBieQorICogIGNvbmNhdGVuYXRpbmcgdGhlIGZvdXIgYnl0ZXMsIHdpdGggdGhlIGZpcnN0IHJlYWQgcGxhY2VkIGluIGJ5dGUgMCAodGhlCisgKiAgbW9zdCBzaWduaWZpY2FudCBieXRlKSwgYW5kIHNvIG9uIHdpdGggdGhlIGZvdXJ0aCByZWFkIHBsYWNlZCBpbiBieXRlIDMKKyAqICAodGhlIGxlYXN0IHNpZ25pZmljYW50IGJ5dGUpLgorICovCisjZGVmaW5lIF9IUkNXX1RBQkxFX0VOVFJZKHcpCQlcCisJLmZpbGwJOCwxLCgoKHcpPj4yNCkmMHhmZik7CVwKKwkuZmlsbAk4LDEsKCgodyk+PjE2KSYweGZmKTsJXAorCS5maWxsCTgsMSwoKCh3KT4+IDgpJjB4ZmYpOwlcCisJLmZpbGwJOCwxLCgoKHcpICAgICkmMHhmZikKKwkudGV4dAorCS5nbG9ibAlfaHJjd190YWJsZQorX2hyY3dfdGFibGU6CisJX0hSQ1dfVEFCTEVfRU5UUlkoQ09ORklHX1NZU19IUkNXX01BU1RFUikKKwlfSFJDV19UQUJMRV9FTlRSWShDT05GSUdfU1lTX0hSQ1dfU0xBVkUxKQorCV9IUkNXX1RBQkxFX0VOVFJZKENPTkZJR19TWVNfSFJDV19TTEFWRTIpCisJX0hSQ1dfVEFCTEVfRU5UUlkoQ09ORklHX1NZU19IUkNXX1NMQVZFMykKKwlfSFJDV19UQUJMRV9FTlRSWShDT05GSUdfU1lTX0hSQ1dfU0xBVkU0KQorCV9IUkNXX1RBQkxFX0VOVFJZKENPTkZJR19TWVNfSFJDV19TTEFWRTUpCisJX0hSQ1dfVEFCTEVfRU5UUlkoQ09ORklHX1NZU19IUkNXX1NMQVZFNikKKwlfSFJDV19UQUJMRV9FTlRSWShDT05GSUdfU1lTX0hSQ1dfU0xBVkU3KQorLyoKKyAqICBBZnRlciBjb25maWd1cmF0aW9uLCBhIHN5c3RlbSByZXNldCBleGNlcHRpb24gaXMgZXhlY3V0ZWQgdXNpbmcgdGhlCisgKiAgdmVjdG9yIGF0IG9mZnNldCAweDEwMCByZWxhdGl2ZSB0byB0aGUgYmFzZSBzZXQgYnkgTVNSW0lQXS4gSWYgTVNSW0lQXQorICogIGlzIDAsIHRoZSBiYXNlIGFkZHJlc3MgaXMgMHgwMDAwMDAwMC4gSWYgTVNSW0lQXSBpcyAxLCB0aGUgYmFzZSBhZGRyZXNzCisgKiAgaXMgMHhmZmYwMDAwMC4gSW4gdGhlIGNhc2Ugb2YgYSBQb3dlciBPbiBSZXNldCBvciBIYXJkIFJlc2V0LCB0aGUgdmFsdWUKKyAqICBvZiBNU1JbSVBdIGlzIGRldGVybWluZWQgYnkgdGhlIENJUCBmaWVsZCBpbiB0aGUgSFJDVy4KKyAqCisgKiAgT3RoZXIgYml0cyBpbiB0aGUgSFJDVyBzZXQgdXAgdGhlIEJhc2UgQWRkcmVzcyBhbmQgUG9ydCBTaXplIGluIEJSMC4KKyAqICBUaGlzIGRldGVybWluZXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBib290IFJPTSAoZmxhc2ggb3IgRVBST00pIGluIHRoZQorICogIHByb2Nlc3NvcidzIGFkZHJlc3Mgc3BhY2UgYXQgYm9vdCB0aW1lLiBBcyBsb25nIGFzIHRoZSBIUkNXIGlzIHNldCB1cAorICogIHNvIHRoYXQgd2UgZXZlbnR1YWxseSBlbmQgdXAgZXhlY3V0aW5nIHRoZSBjb2RlIGJlbG93IHdoZW4gdGhlIHByb2Nlc3NvcgorICogIGV4ZWN1dGVzIHRoZSByZXNldCBleGNlcHRpb24sIHRoZSBhY3R1YWwgdmFsdWVzIHVzZWQgc2hvdWxkIG5vdCBtYXR0ZXIuCisgKgorICogIE9uY2Ugd2UgaGF2ZSBnb3QgaGVyZSwgdGhlIGFkZHJlc3MgbWFzayBpbiBPUjAgaXMgY2xlYXJlZCBzbyB0aGF0IHRoZQorICogIGJvdHRvbSAzMksgb2YgdGhlIGJvb3QgUk9NIGlzIGVmZmVjdGl2ZWx5IHJlcGVhdGVkIGFsbCB0aHJvdWdob3V0IHRoZQorICogIHByb2Nlc3NvcidzIGFkZHJlc3Mgc3BhY2UsIGFmdGVyIHdoaWNoIHdlIGNhbiBqdW1wIHRvIHRoZSBhYnNvbHV0ZQorICogIGFkZHJlc3MgYXQgd2hpY2ggdGhlIGJvb3QgUk9NIHdhcyBsaW5rZWQgYXQgY29tcGlsZSB0aW1lLCBhbmQgcHJvY2VlZAorICogIHRvIGluaXRpYWxpc2UgdGhlIG1lbW9yeSBjb250cm9sbGVyIHdpdGhvdXQgd29ycnlpbmcgaWYgdGhlIHJ1ZyB3aWxsIGJlCisgKiAgcHVsbGVkIG91dCBmcm9tIHVuZGVyIHVzLCBzbyB0byBzcGVhayAoaXQgd2lsbCBiZSBmaW5lIGFzIGxvbmcgYXMgd2UKKyAqICBjb25maWd1cmUgQlIwIHdpdGggdGhlIHNhbWUgYm9vdCBST00gbGluayBhZGRyZXNzKS4KKyAqLworCS4gPSBFWENfT0ZGX1NZU19SRVNFVAorCisJLmdsb2JsCV9zdGFydAorX3N0YXJ0OgorCWxpCXIyMSwgQk9PVEZMQUdfQ09MRAkvKiBOb3JtYWwgUG93ZXItT246IEJvb3QgZnJvbSBGTEFTSCovCisJbm9wCisJYglib290X2NvbGQKKworCS4gPSBFWENfT0ZGX1NZU19SRVNFVCArIDB4MTAKKworCS5nbG9ibAlfc3RhcnRfd2FybQorX3N0YXJ0X3dhcm06CisJbGkJcjIxLCBCT09URkxBR19XQVJNCS8qIFNvZnR3YXJlIHJlYm9vdAkJKi8KKwliCWJvb3Rfd2FybQorCitib290X2NvbGQ6CisjaWYgZGVmaW5lZChDT05GSUdfTVBDODI2MEFEUykgJiYgZGVmaW5lZChDT05GSUdfU1lTX0RFRkFVTFRfSU1NUikKKwlsaXMJcjMsIENPTkZJR19TWVNfREVGQVVMVF9JTU1SQGgKKwlub3AKKwlsd3oJcjQsIDAocjMpCisJbm9wCisJcmx3aW5tCXI0LCByNCwgMCwgOCwgNQorCW5vcAorCW9yaXMJcjQsIHI0LCAweDAyMDAKKwlub3AKKwlzdHcJcjQsIDAocjMpCisJbm9wCisjZW5kaWYgLyogQ09ORklHX01QQzgyNjBBRFMgJiYgQ09ORklHX1NZU19ERUZBVUxUX0lNTVIgKi8KK2Jvb3Rfd2FybToKKwltZm1zcglyNQkJCS8qIHNhdmUgbXNyIGNvbnRlbnRzCQkqLworCisjaWYgZGVmaW5lZChDT05GSUdfQ09HRU5UKQorCS8qIHRoaXMgaXMgd2hhdCB0aGUgY29nZW50IEVQUk9NIGRvZXMgKi8KKwlsaQlyMCwgMAorCW10bXNyCXIwCisJaXN5bmMKKwlibAljb2dlbnRfaW5pdF84MjYwCisjZW5kaWYJLyogQ09ORklHX0NPR0VOVCAqLworCisjaWYgZGVmaW5lZChDT05GSUdfU1lTX0RFRkFVTFRfSU1NUikKKwlsaXMJcjMsIENPTkZJR19TWVNfSU1NUkBoCisJb3JpCXIzLCByMywgQ09ORklHX1NZU19JTU1SQGwKKwlsaXMJcjQsIENPTkZJR19TWVNfREVGQVVMVF9JTU1SQGgKKwlzdHcJcjMsIDB4MUE4KHI0KQorI2VuZGlmIC8qIENPTkZJR19TWVNfREVGQVVMVF9JTU1SICovCisKKwkvKiBJbml0aWFsaXNlIHRoZSBNUEM4MjYwIHByb2Nlc3NvciBjb3JlCQkJKi8KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCWJsCWluaXRfODI2MF9jb3JlCisKKyNpZm5kZWYgQ09ORklHX1NZU19SQU1CT09UCisJLyogV2hlbiBib290aW5nIGZyb20gUk9NIChGbGFzaCBvciBFUFJPTSksIGNsZWFyIHRoZQkJKi8KKwkvKiBBZGRyZXNzIE1hc2sgaW4gT1IwIHNvIFJPTSBhcHBlYXJzIGV2ZXJ5d2hlcmUJCSovCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwlsaXMJcjMsIChDT05GSUdfU1lTX0lNTVIrSU1fUkVHQkFTRSlAaAorCWx3eglyNCwgSU1fT1IwQGwocjMpCisJbGkJcjUsIDB4N2ZmZgorCWFuZAlyNCwgcjQsIHI1CisJc3R3CXI0LCBJTV9PUjBAbChyMykKKworCS8qIENhbGN1bGF0ZSBhYnNvbHV0ZSBhZGRyZXNzIGluIEZMQVNIIGFuZCBqdW1wIHRoZXJlCQkqLworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJbGlzCXIzLCBDT05GSUdfU1lTX01PTklUT1JfQkFTRUBoCisJb3JpCXIzLCByMywgQ09ORklHX1NZU19NT05JVE9SX0JBU0VAbAorCWFkZGkJcjMsIHIzLCBpbl9mbGFzaCAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCisJbXRscglyMworCWJscgorCitpbl9mbGFzaDoKKyNlbmRpZgkvKiBDT05GSUdfU1lTX1JBTUJPT1QgKi8KKworCS8qIGluaXRpYWxpemUgc29tZSB0aGluZ3MgdGhhdCBhcmUgaGFyZCB0byBhY2Nlc3MgZnJvbSBDCSovCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwlsaXMJcjMsIENPTkZJR19TWVNfSU1NUkBoCQkvKiBzZXQgdXAgc3RhY2sgaW4gaW50ZXJuYWwgRFBSQU0gKi8KKwlvcmkJcjEsIHIzLCBDT05GSUdfU1lTX0lOSVRfU1BfT0ZGU0VUCisJbGkJcjAsIDAJCQkvKiBNYWtlIHJvb20gZm9yIHN0YWNrIGZyYW1lIGhlYWRlciBhbmQJKi8KKwlzdHd1CXIwLCAtNChyMSkJCS8qIGNsZWFyIGZpbmFsIHN0YWNrIGZyYW1lIHNvIHRoYXQJKi8KKwlzdHd1CXIwLCAtNChyMSkJCS8qIHN0YWNrIGJhY2t0cmFjZXMgdGVybWluYXRlIGNsZWFubHkJKi8KKworCS8qIGxldCB0aGUgQy1jb2RlIHNldCB1cCB0aGUgcmVzdAkJCQkqLworCS8qCQkJCQkJCQkqLworCS8qIEJlIGNhcmVmdWwgdG8ga2VlcCBjb2RlIHJlbG9jYXRhYmxlICEJCQkqLworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJR0VUX0dPVAkJCS8qIGluaXRpYWxpemUgR09UIGFjY2VzcwkJKi8KKworCS8qIHIzOiBJTU1SICovCisJYmwJY3B1X2luaXRfZgkvKiBydW4gbG93LWxldmVsIENQVSBpbml0IGNvZGUgKGluIEZsYXNoKSovCisKKyNpZmRlZiBERUJVRworCWJsCWluaXRfZGVidWcJLyogc2V0IHVwIGRlYnVnZ2luZyBzdHVmZgkJKi8KKyNlbmRpZgorCisJbXIJcjMsIHIyMQorCS8qIHIzOiBCT09URkxBRyAqLworCWJsCWJvYXJkX2luaXRfZgkvKiBydW4gMXN0IHBhcnQgb2YgYm9hcmQgaW5pdCBjb2RlIChpbiBGbGFzaCkqLworCisvKgorICogVmVjdG9yIFRhYmxlCisgKi8KKworCS5nbG9ibAlfc3RhcnRfb2ZfdmVjdG9ycworX3N0YXJ0X29mX3ZlY3RvcnM6CisKKy8qIE1hY2hpbmUgY2hlY2sgKi8KKwlTVERfRVhDRVBUSU9OKDB4MjAwLCBNYWNoaW5lQ2hlY2ssIE1hY2hpbmVDaGVja0V4Y2VwdGlvbikKKworLyogRGF0YSBTdG9yYWdlIGV4Y2VwdGlvbi4gKi8KKwlTVERfRVhDRVBUSU9OKDB4MzAwLCBEYXRhU3RvcmFnZSwgVW5rbm93bkV4Y2VwdGlvbikKKworLyogSW5zdHJ1Y3Rpb24gU3RvcmFnZSBleGNlcHRpb24uICovCisJU1REX0VYQ0VQVElPTigweDQwMCwgSW5zdFN0b3JhZ2UsIFVua25vd25FeGNlcHRpb24pCisKKy8qIEV4dGVybmFsIEludGVycnVwdCBleGNlcHRpb24uICovCisJU1REX0VYQ0VQVElPTigweDUwMCwgRXh0SW50ZXJydXB0LCBleHRlcm5hbF9pbnRlcnJ1cHQpCisKKy8qIEFsaWdubWVudCBleGNlcHRpb24uICovCisJLiA9IDB4NjAwCitBbGlnbm1lbnQ6CisJRVhDRVBUSU9OX1BST0xPRyhTUlIwLCBTUlIxKQorCW1mc3ByCXI0LERBUgorCXN0dwlyNCxfREFSKHIyMSkKKwltZnNwcglyNSxEU0lTUgorCXN0dwlyNSxfRFNJU1IocjIxKQorCWFkZGkJcjMscjEsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQKKwlFWENfWEZFUl9URU1QTEFURShBbGlnbm1lbnQsIEFsaWdubWVudEV4Y2VwdGlvbiwgTVNSX0tFUk5FTCwgQ09QWV9FRSkKKworLyogUHJvZ3JhbSBjaGVjayBleGNlcHRpb24gKi8KKwkuID0gMHg3MDAKK1Byb2dyYW1DaGVjazoKKwlFWENFUFRJT05fUFJPTE9HKFNSUjAsIFNSUjEpCisJYWRkaQlyMyxyMSxTVEFDS19GUkFNRV9PVkVSSEVBRAorCUVYQ19YRkVSX1RFTVBMQVRFKFByb2dyYW1DaGVjaywgUHJvZ3JhbUNoZWNrRXhjZXB0aW9uLAorCQlNU1JfS0VSTkVMLCBDT1BZX0VFKQorCisJU1REX0VYQ0VQVElPTigweDgwMCwgRlBVbmF2YWlsYWJsZSwgVW5rbm93bkV4Y2VwdGlvbikKKworCS8qIEkgZ3Vlc3Mgd2UgY291bGQgaW1wbGVtZW50IGRlY3JlbWVudGVyLCBhbmQgbWF5IGhhdmUKKwkgKiB0byBzb21lZGF5IGZvciB0aW1la2VlcGluZy4KKwkgKi8KKwlTVERfRVhDRVBUSU9OKDB4OTAwLCBEZWNyZW1lbnRlciwgdGltZXJfaW50ZXJydXB0KQorCisJU1REX0VYQ0VQVElPTigweGEwMCwgVHJhcF8wYSwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4YjAwLCBUcmFwXzBiLCBVbmtub3duRXhjZXB0aW9uKQorCVNURF9FWENFUFRJT04oMHhjMDAsIFN5c3RlbUNhbGwsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweGQwMCwgU2luZ2xlU3RlcCwgVW5rbm93bkV4Y2VwdGlvbikKKworCVNURF9FWENFUFRJT04oMHhlMDAsIFRyYXBfMGUsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweGYwMCwgVHJhcF8wZiwgVW5rbm93bkV4Y2VwdGlvbikKKworCVNURF9FWENFUFRJT04oMHgxMDAwLCBJbnN0cnVjdGlvblRMQk1pc3MsIFVua25vd25FeGNlcHRpb24pCisJU1REX0VYQ0VQVElPTigweDExMDAsIERhdGFMb2FkVExCTWlzcywgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MTIwMCwgRGF0YVN0b3JlVExCTWlzcywgVW5rbm93bkV4Y2VwdGlvbikKKyNpZmRlZiBERUJVRworCS4gPSAweDEzMDAKKwkvKgorCSAqIFRoaXMgZXhjZXB0aW9uIG9jY3VycyB3aGVuIHRoZSBwcm9ncmFtIGNvdW50ZXIgbWF0Y2hlcyB0aGUKKwkgKiBJbnN0cnVjdGlvbiBBZGRyZXNzIEJyZWFrcG9pbnQgUmVnaXN0ZXIgKElBQlIpLgorCSAqCisJICogSSB3YW50IHRoZSBjcHUgdG8gaGFsdCBpZiB0aGlzIG9jY3VycyBzbyBJIGNhbiBodW50IGFyb3VuZAorCSAqIHdpdGggdGhlIGRlYnVnZ2VyIGFuZCBsb29rIGF0IHRoaW5ncy4KKwkgKgorCSAqIFdoZW4gREVCVUcgaXMgZGVmaW5lZCwgYm90aCBtYWNoaW5lIGNoZWNrIGVuYWJsZSAoaW4gdGhlIE1TUikKKwkgKiBhbmQgY2hlY2tzdG9wIHJlc2V0IGVuYWJsZSAoaW4gdGhlIHJlc2V0IG1vZGUgcmVnaXN0ZXIpIGFyZQorCSAqIHR1cm5lZCBvZmYgYW5kIHNvIGEgY2hlY2tzdG9wIGNvbmRpdGlvbiB3aWxsIHJlc3VsdCBpbiB0aGUgY3B1CisJICogaGFsdGluZy4KKwkgKgorCSAqIEkgZm9yY2UgdGhlIGNwdSBpbnRvIGEgY2hlY2tzdG9wIGNvbmRpdGlvbiBieSBwdXR0aW5nIGFuIGlsbGVnYWwKKwkgKiBpbnN0cnVjdGlvbiBoZXJlIChhdCBsZWFzdCB0aGlzIGlzIHRoZSB0aGVvcnkpLgorCSAqCisJICogd2VsbCAtIHRoYXQgZGlkbnQgd29yaywgc28ganVzdCBkbyBhbiBpbmZpbml0ZSBsb29wIQorCSAqLworMToJYgkxYgorI2Vsc2UKKwlTVERfRVhDRVBUSU9OKDB4MTMwMCwgSW5zdHJ1Y3Rpb25CcmVha3BvaW50LCBEZWJ1Z0V4Y2VwdGlvbikKKyNlbmRpZgorCVNURF9FWENFUFRJT04oMHgxNDAwLCBTTUksIFVua25vd25FeGNlcHRpb24pCisKKwlTVERfRVhDRVBUSU9OKDB4MTUwMCwgVHJhcF8xNSwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MTYwMCwgVHJhcF8xNiwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MTcwMCwgVHJhcF8xNywgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MTgwMCwgVHJhcF8xOCwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MTkwMCwgVHJhcF8xOSwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MWEwMCwgVHJhcF8xYSwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MWIwMCwgVHJhcF8xYiwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MWMwMCwgVHJhcF8xYywgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MWQwMCwgVHJhcF8xZCwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MWUwMCwgVHJhcF8xZSwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MWYwMCwgVHJhcF8xZiwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MjAwMCwgVHJhcF8yMCwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MjEwMCwgVHJhcF8yMSwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MjIwMCwgVHJhcF8yMiwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MjMwMCwgVHJhcF8yMywgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MjQwMCwgVHJhcF8yNCwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MjUwMCwgVHJhcF8yNSwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MjYwMCwgVHJhcF8yNiwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MjcwMCwgVHJhcF8yNywgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MjgwMCwgVHJhcF8yOCwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MjkwMCwgVHJhcF8yOSwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MmEwMCwgVHJhcF8yYSwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MmIwMCwgVHJhcF8yYiwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MmMwMCwgVHJhcF8yYywgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MmQwMCwgVHJhcF8yZCwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MmUwMCwgVHJhcF8yZSwgVW5rbm93bkV4Y2VwdGlvbikKKwlTVERfRVhDRVBUSU9OKDB4MmYwMCwgVHJhcF8yZiwgVW5rbm93bkV4Y2VwdGlvbikKKworCisJLmdsb2JsCV9lbmRfb2ZfdmVjdG9ycworX2VuZF9vZl92ZWN0b3JzOgorCisJLiA9IDB4MzAwMAorCisvKgorICogVGhpcyBjb2RlIGZpbmlzaGVzIHNhdmluZyB0aGUgcmVnaXN0ZXJzIHRvIHRoZSBleGNlcHRpb24gZnJhbWUKKyAqIGFuZCBqdW1wcyB0byB0aGUgYXBwcm9wcmlhdGUgaGFuZGxlciBmb3IgdGhlIGV4Y2VwdGlvbi4KKyAqIFJlZ2lzdGVyIHIyMSBpcyBwb2ludGVyIGludG8gdHJhcCBmcmFtZSwgcjEgaGFzIG5ldyBzdGFjayBwb2ludGVyLgorICovCisJLmdsb2JsCXRyYW5zZmVyX3RvX2hhbmRsZXIKK3RyYW5zZmVyX3RvX2hhbmRsZXI6CisJc3R3CXIyMixfTklQKHIyMSkKKwlsaXMJcjIyLE1TUl9QT1dAaAorCWFuZGMJcjIzLHIyMyxyMjIKKwlzdHcJcjIzLF9NU1IocjIxKQorCVNBVkVfR1BSKDcsIHIyMSkKKwlTQVZFXzRHUFJTKDgsIHIyMSkKKwlTQVZFXzhHUFJTKDEyLCByMjEpCisJU0FWRV84R1BSUygyNCwgcjIxKQorCW1mbHIJcjIzCisJYW5kaS4JcjI0LHIyMywweDNmMDAJCS8qIGdldCB2ZWN0b3Igb2Zmc2V0ICovCisJc3R3CXIyNCxUUkFQKHIyMSkKKwlsaQlyMjIsMAorCXN0dwlyMjIsUkVTVUxUKHIyMSkKKwlsd3oJcjI0LDAocjIzKQkJLyogdmlydHVhbCBhZGRyZXNzIG9mIGhhbmRsZXIgKi8KKwlsd3oJcjIzLDQocjIzKQkJLyogd2hlcmUgdG8gZ28gd2hlbiBkb25lICovCisJbXRzcHIJU1JSMCxyMjQKKwltdHNwcglTUlIxLHIyMAorCW10bHIJcjIzCisJU1lOQworCXJmaQkJCQkvKiBqdW1wIHRvIGhhbmRsZXIsIGVuYWJsZSBNTVUgKi8KKworaW50X3JldHVybjoKKwltZm1zcglyMjgJCS8qIERpc2FibGUgaW50ZXJydXB0cyAqLworCWxpCXI0LDAKKwlvcmkJcjQscjQsTVNSX0VFCisJYW5kYwlyMjgscjI4LHI0CisJU1lOQwkJCS8qIFNvbWUgY2hpcCByZXZzIG5lZWQgdGhpcy4uLiAqLworCW10bXNyCXIyOAorCVNZTkMKKwlsd3oJcjIsX0NUUihyMSkKKwlsd3oJcjAsX0xJTksocjEpCisJbXRjdHIJcjIKKwltdGxyCXIwCisJbHd6CXIyLF9YRVIocjEpCisJbHd6CXIwLF9DQ1IocjEpCisJbXRzcHIJWEVSLHIyCisJbXRjcmYJMHhGRixyMAorCVJFU1RfMTBHUFJTKDMsIHIxKQorCVJFU1RfMTBHUFJTKDEzLCByMSkKKwlSRVNUXzhHUFJTKDIzLCByMSkKKwlSRVNUX0dQUigzMSwgcjEpCisJbHd6CXIyLF9OSVAocjEpCS8qIFJlc3RvcmUgZW52aXJvbm1lbnQgKi8KKwlsd3oJcjAsX01TUihyMSkKKwltdHNwcglTUlIwLHIyCisJbXRzcHIJU1JSMSxyMAorCWx3eglyMCxHUFIwKHIxKQorCWx3eglyMixHUFIyKHIxKQorCWx3eglyMSxHUFIxKHIxKQorCVNZTkMKKwlyZmkKKworI2lmIGRlZmluZWQoQ09ORklHX0NPR0VOVCkKKworLyoKKyAqIFRoaXMgY29kZSBpbml0aWFsaXNlcyB0aGUgTVBDODI2MCBwcm9jZXNzb3IgY29yZQorICogKGNvbmZvcm1zIHRvIFBvd2VyUEMgNjAzZSBzcGVjKQorICovCisKKwkuZ2xvYmwJY29nZW50X2luaXRfODI2MAorY29nZW50X2luaXRfODI2MDoKKworCS8qIFRha2VuIGZyb20gcGFnZSAxNCBvZiBDTUEyODIgbWFudWFsCQkJCSovCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwlsaXMJcjQsIChDT05GSUdfU1lTX0lNTVIrSU1fUkVHQkFTRSlAaAorCWxpcwlyMywgQ09ORklHX1NZU19JTU1SQGgKKwlzdHcJcjMsIElNX0lNTVJAbChyNCkKKwlsd3oJcjMsIElNX0lNTVJAbChyNCkKKwlzdHcJcjMsIDAocjApCisJbGlzCXIzLCBDT05GSUdfU1lTX1NZUENSQGgKKwlvcmkJcjMsIHIzLCBDT05GSUdfU1lTX1NZUENSQGwKKwlzdHcJcjMsIElNX1NZUENSQGwocjQpCisJbHd6CXIzLCBJTV9TWVBDUkBsKHI0KQorCXN0dwlyMywgNChyMCkKKwlsaXMJcjMsIENPTkZJR19TWVNfU0NDUkBoCisJb3JpCXIzLCByMywgQ09ORklHX1NZU19TQ0NSQGwKKwlzdHcJcjMsIElNX1NDQ1JAbChyNCkKKwlsd3oJcjMsIElNX1NDQ1JAbChyNCkKKwlzdHcJcjMsIDgocjApCisKKwkvKiB0aGUgcmVzdCBvZiB0aGlzIHdhcyBkaXNhc3NlbWJsZWQgZnJvbSB0aGUJCQkqLworCS8qIEVQUk9NIGNvZGUgdGhhdCBjYW1lIHdpdGggbXkgQ01BMjgyIENQVSBtb2R1bGUJCSovCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwlsaXMJcjEsIDB4MTIzNAorCW9yaQlyMSwgcjEsIDB4NTY3OAorCXN0dwlyMSwgMHgyMChyMCkKKwlsd3oJcjEsIDB4MjAocjApCisJc3R3CXIxLCAweDI0KHIwKQorCWx3eglyMSwgMHgyNChyMCkKKwlsaXMJcjMsIDB4MGU4MAorCW9yaQlyMywgcjMsIDAKKwlzdHcJcjEsIDQocjMpCisJbHd6CXIxLCA0KHIzKQorCisJLyogRG9uZSEJCQkJCQkJKi8KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCWJscgorCisjZW5kaWYJLyogQ09ORklHX0NPR0VOVCAqLworCisvKgorICogVGhpcyBjb2RlIGluaXRpYWxpc2VzIHRoZSBNUEM4MjYwIHByb2Nlc3NvciBjb3JlCisgKiAoY29uZm9ybXMgdG8gUG93ZXJQQyA2MDNlIHNwZWMpCisgKiBOb3RlOiBleHBlY3RzIG9yaWdpbmFsIE1TUiBjb250ZW50cyB0byBiZSBpbiByNS4KKyAqLworCisJLmdsb2JsCWluaXRfODI2MF9jb3JlCitpbml0XzgyNjBfY29yZToKKworCS8qIEluaXRpYWxpemUgbWFjaGluZSBzdGF0dXM7IGVuYWJsZSBtYWNoaW5lIGNoZWNrIGludGVycnVwdAkqLworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJbGkJcjMsIE1TUl9LRVJORUwJCS8qIFNldCBNRSBhbmQgUkkgZmxhZ3MgKi8KKwlybHdpbWkJcjMsIHI1LCAwLCAyNSwgMjUJLyogcHJlc2VydmUgSVAgYml0IHNldCBieSBIUkNXICovCisjaWZkZWYgREVCVUcKKwlybHdpbWkJcjMsIHI1LCAwLCAyMSwgMjIJLyogZGVidWdnZXIgbWlnaHQgc2V0IFNFICYgQkUgYml0cyAqLworI2VuZGlmCisJU1lOQwkJCQkvKiBTb21lIGNoaXAgcmV2cyBuZWVkIHRoaXMuLi4gKi8KKwltdG1zcglyMworCVNZTkMKKwltdHNwcglTUlIxLCByMwkJLyogTWFrZSBTUlIxIG1hdGNoIE1TUiAqLworCisJLyogSW5pdGlhbGlzZSB0aGUgU1lQQ1IgZWFybHksIGFuZCByZXNldCB0aGUgd2F0Y2hkb2cgKGlmIHJlcSkJKi8KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCWxpcwlyMywgKENPTkZJR19TWVNfSU1NUitJTV9SRUdCQVNFKUBoCisjaWYgIWRlZmluZWQoQ09ORklHX0NPR0VOVCkKKwlsaXMJcjQsIENPTkZJR19TWVNfU1lQQ1JAaAorCW9yaQlyNCwgcjQsIENPTkZJR19TWVNfU1lQQ1JAbAorCXN0dwlyNCwgSU1fU1lQQ1JAbChyMykKKyNlbmRpZiAvKiAhQ09ORklHX0NPR0VOVCAqLworI2lmIGRlZmluZWQoQ09ORklHX1dBVENIRE9HKQorCWxpCXI0LCAyMTg2OAkJLyogPSAweDU1NmMgKi8KKwlzdGgJcjQsIElNX1NXU1JAbChyMykKKwlsaQlyNCwgLTIxOTU5CQkvKiA9IDB4YWEzOSAqLworCXN0aAlyNCwgSU1fU1dTUkBsKHIzKQorI2VuZGlmIC8qIENPTkZJR19XQVRDSERPRyAqLworCisJLyogSW5pdGlhbGl6ZSB0aGUgSGFyZHdhcmUgSW1wbGVtZW50YXRpb24tZGVwZW5kZW50IFJlZ2lzdGVycwkqLworCS8qIEhJRDAgYWxzbyBjb250YWlucyBjYWNoZSBjb250cm9sCQkJCSovCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwlsaXMJcjMsIENPTkZJR19TWVNfSElEMF9JTklUQGgKKwlvcmkJcjMsIHIzLCBDT05GSUdfU1lTX0hJRDBfSU5JVEBsCisJU1lOQworCW10c3ByCUhJRDAsIHIzCisKKwlsaXMJcjMsIENPTkZJR19TWVNfSElEMF9GSU5BTEBoCisJb3JpCXIzLCByMywgQ09ORklHX1NZU19ISUQwX0ZJTkFMQGwKKwlTWU5DCisJbXRzcHIJSElEMCwgcjMKKworCWxpcwlyMywgQ09ORklHX1NZU19ISUQyQGgKKwlvcmkJcjMsIHIzLCBDT05GSUdfU1lTX0hJRDJAbAorCW10c3ByCUhJRDIsIHIzCisKKwkvKiBjbGVhciBhbGwgQkFUJ3MJCQkJCQkqLworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJbGkJcjAsIDAKKwltdHNwcglEQkFUMFUsIHIwCisJbXRzcHIJREJBVDBMLCByMAorCW10c3ByCURCQVQxVSwgcjAKKwltdHNwcglEQkFUMUwsIHIwCisJbXRzcHIJREJBVDJVLCByMAorCW10c3ByCURCQVQyTCwgcjAKKwltdHNwcglEQkFUM1UsIHIwCisJbXRzcHIJREJBVDNMLCByMAorCW10c3ByCUlCQVQwVSwgcjAKKwltdHNwcglJQkFUMEwsIHIwCisJbXRzcHIJSUJBVDFVLCByMAorCW10c3ByCUlCQVQxTCwgcjAKKwltdHNwcglJQkFUMlUsIHIwCisJbXRzcHIJSUJBVDJMLCByMAorCW10c3ByCUlCQVQzVSwgcjAKKwltdHNwcglJQkFUM0wsIHIwCisJU1lOQworCisJLyogaW52YWxpZGF0ZSBhbGwgdGxiJ3MJCQkJCQkqLworCS8qCQkJCQkJCQkqLworCS8qIEZyb20gdGhlIDYwM2UgVXNlciBNYW51YWw6ICJUaGUgNjAzZSBwcm92aWRlcyB0aGUgYWJpbGl0eSB0bwkqLworCS8qIGludmFsaWRhdGUgYSBUTEIgZW50cnkuIFRoZSBUTEIgSW52YWxpZGF0ZSBFbnRyeSAodGxiaWUpCSovCisJLyogaW5zdHJ1Y3Rpb24gaW52YWxpZGF0ZXMgdGhlIFRMQiBlbnRyeSBpbmRleGVkIGJ5IHRoZSBFQSwgYW5kCSovCisJLyogb3BlcmF0ZXMgb24gYm90aCB0aGUgaW5zdHJ1Y3Rpb24gYW5kIGRhdGEgVExCcyBzaW11bHRhbmVvdXNseSovCisJLyogaW52YWxpZGF0aW5nIGZvdXIgVExCIGVudHJpZXMgKGJvdGggc2V0cyBpbiBlYWNoIFRMQikuIFRoZQkqLworCS8qIGluZGV4IGNvcnJlc3BvbmRzIHRvIGJpdHMgMTUtMTkgb2YgdGhlIEVBLiBUbyBpbnZhbGlkYXRlIGFsbAkqLworCS8qIGVudHJpZXMgd2l0aGluIGJvdGggVExCcywgMzIgdGxiaWUgaW5zdHJ1Y3Rpb25zIHNob3VsZCBiZQkqLworCS8qIGlzc3VlZCwgaW5jcmVtZW50aW5nIHRoaXMgZmllbGQgYnkgb25lIGVhY2ggdGltZS4iCQkqLworCS8qCQkJCQkJCQkqLworCS8qICJOb3RlIHRoYXQgdGhlIHRsYmlhIGluc3RydWN0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZCBvbiB0aGUJKi8KKwkvKiA2MDNlLiIJCQkJCQkJKi8KKwkvKgkJCQkJCQkJKi8KKwkvKiBiaXRzIDE1LTE5IGNvcnJlc3BvbmQgdG8gYWRkcmVzc2VzIDB4MDAwMDAwMDAgdG8gMHgwMDAxRjAwMAkqLworCS8qIGluY3JlbWVudGluZyBieSAweDEwMDAgZWFjaCB0aW1lLiBUaGUgY29kZSBiZWxvdyBpcyBzb3J0IG9mCSovCisJLyogYmFzZWQgb24gY29kZSBpbiAiZmx1c2hfdGxicyIgZnJvbSBhcmNoL3Bvd2VycGMva2VybmVsL2hlYWQuUwkqLworCS8qCQkJCQkJCQkqLworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJbGkJcjMsIDMyCisJbXRjdHIJcjMKKwlsaQlyMywgMAorMToJdGxiaWUJcjMKKwlhZGRpCXIzLCByMywgMHgxMDAwCisJYmRuegkxYgorCVNZTkMKKworCS8qIERvbmUhCQkJCQkJCSovCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwlibHIKKworI2lmZGVmIERFQlVHCisKKy8qCisgKiBpbml0aWFsaXNlIHRoaW5ncyByZWxhdGVkIHRvIGRlYnVnZ2luZy4KKyAqCisgKiBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSAoR09UKSBpcyBpbml0aWFsaXNlZAorICogKEdFVF9HT1QpIGFuZCBhZnRlciBjcHVfaW5pdF9mKCkgaGFzIGV4ZWN1dGVkLgorICovCisKKwkuZ2xvYmwJaW5pdF9kZWJ1ZworaW5pdF9kZWJ1ZzoKKworCWxpcwlyMywgKENPTkZJR19TWVNfSU1NUitJTV9SRUdCQVNFKUBoCisKKwkvKiBRdWljayBhbmQgZGlydHkgaGFjayB0byBlbmFibGUgdGhlIFJBTSBhbmQgY29weSB0aGUJCSovCisJLyogdmVjdG9ycyBzbyB0aGF0IHdlIGNhbiB0YWtlIGV4Y2VwdGlvbnMuCQkJKi8KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwkvKiB3cml0ZSBNZW1vcnkgUmVmcmVzaCBQcmVzY2FsZXIgKi8KKwlsaQlyNCwgQ09ORklHX1NZU19NUFRQUgorCXN0aAlyNCwgSU1fTVBUUFJAbChyMykKKwkvKiB3cml0ZSA2MHggUmVmcmVzaCBUaW1lciAqLworCWxpCXI0LCBDT05GSUdfU1lTX1BTUlQKKwlzdGIJcjQsIElNX1BTUlRAbChyMykKKwkvKiBpbml0IHRoZSA2MHggU0RSQU0gTW9kZSBSZWdpc3RlciAqLworCWxpcwlyNCwgKENPTkZJR19TWVNfUFNETVJ8UFNETVJfT1BfTk9STSlAaAorCW9yaQlyNCwgcjQsIChDT05GSUdfU1lTX1BTRE1SfFBTRE1SX09QX05PUk0pQGwKKwlzdHcJcjQsIElNX1BTRE1SQGwocjMpCisJLyogd3JpdGUgUHJlY2hhcmdlIEFsbCBCYW5rcyBjb21tYW5kICovCisJbGlzCXI0LCAoQ09ORklHX1NZU19QU0RNUnxQU0RNUl9PUF9QUkVBKUBoCisJb3JpCXI0LCByNCwgKENPTkZJR19TWVNfUFNETVJ8UFNETVJfT1BfUFJFQSlAbAorCXN0dwlyNCwgSU1fUFNETVJAbChyMykKKwlzdGIJcjAsIDAoMCkKKwkvKiB3cml0ZSBlaWdodCBDQlIgUmVmcmVzaCBjb21tYW5kcyAqLworCWxpcwlyNCwgKENPTkZJR19TWVNfUFNETVJ8UFNETVJfT1BfQ0JSUilAaAorCW9yaQlyNCwgcjQsIChDT05GSUdfU1lTX1BTRE1SfFBTRE1SX09QX0NCUlIpQGwKKwlzdHcJcjQsIElNX1BTRE1SQGwocjMpCisJc3RiCXIwLCAwKDApCisJc3RiCXIwLCAwKDApCisJc3RiCXIwLCAwKDApCisJc3RiCXIwLCAwKDApCisJc3RiCXIwLCAwKDApCisJc3RiCXIwLCAwKDApCisJc3RiCXIwLCAwKDApCisJc3RiCXIwLCAwKDApCisJLyogd3JpdGUgTW9kZSBSZWdpc3RlciBXcml0ZSBjb21tYW5kICovCisJbGlzCXI0LCAoQ09ORklHX1NZU19QU0RNUnxQU0RNUl9PUF9NUlcpQGgKKwlvcmkJcjQsIHI0LCAoQ09ORklHX1NZU19QU0RNUnxQU0RNUl9PUF9NUlcpQGwKKwlzdHcJcjQsIElNX1BTRE1SQGwocjMpCisJc3RiCXIwLCAwKDApCisJLyogd3JpdGUgTm9ybWFsIE9wZXJhdGlvbiBjb21tYW5kIGFuZCBlbmFibGUgUmVmcmVzaCAqLworCWxpcwlyNCwgKENPTkZJR19TWVNfUFNETVJ8UFNETVJfT1BfTk9STXxQU0RNUl9SRkVOKUBoCisJb3JpCXI0LCByNCwgKENPTkZJR19TWVNfUFNETVJ8UFNETVJfT1BfTk9STXxQU0RNUl9SRkVOKUBsCisJc3R3CXI0LCBJTV9QU0RNUkBsKHIzKQorCXN0YglyMCwgMCgwKQorCS8qIFJBTSBzaG91bGQgbm93IGJlIG9wZXJhdGlvbmFsICovCisKKyNkZWZpbmUgVkVDX1dSRF9DTlQJKChfZW5kX29mX3ZlY3RvcnMgLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVCkgLyA0KQorCW1mbHIJcjMKKwlHRVRfR09UCisJbXRscglyMworCWx3eglyMywgR09UKF9lbmRfb2ZfdmVjdG9ycykKKwlybHdpbm0JcjQsIHIzLCAwLCAxOCwgMzEJLyogX2VuZF9vZl92ZWN0b3JzICYgMHgzRkZGCSovCisJbGlzCXI1LCBWRUNfV1JEX0NOVEBoCisJb3JpCXI1LCByNSwgVkVDX1dSRF9DTlRAbAorCW10Y3RyCXI1CisxOgorCWx3enUJcjUsIC00KHIzKQorCXN0d3UJcjUsIC00KHI0KQorCWJkbnoJMWIKKworCS8qIExvYWQgdGhlIEluc3RydWN0aW9uIEFkZHJlc3MgQnJlYWtwb2ludCBSZWdpc3RlciAoSUFCUikuCSovCisJLyoJCQkJCQkJCSovCisJLyogVGhlIGFkZHJlc3MgdG8gbG9hZCBpcyBzdG9yZWQgaW4gdGhlIGZpcnN0IHdvcmQgb2YgZHVhbCBwb3J0CSovCisJLyogcmFtIGFuZCBzaG91bGQgYmUgcHJlc2VydmVkIHdoaWxlIHRoZSBwb3dlciBpcyBvbiwgc28geW91CSovCisJLyogY2FuIHBsdWcgYWRkcmVzc2VzIGludG8gdGhhdCBsb2NhdGlvbiB0aGVuIHJlc2V0IHRoZSBjcHUgYW5kCSovCisJLyogdGhpcyBjb2RlIHdpbGwgbG9hZCB0aGF0IGFkZHJlc3MgaW50byB0aGUgSUFCUiBhZnRlciB0aGUJKi8KKwkvKiByZXNldC4JCQkJCQkJKi8KKwkvKgkJCQkJCQkJKi8KKwkvKiBXaGVuIHRoZSBwcm9ncmFtIGNvdW50ZXIgbWF0Y2hlcyB0aGUgY29udGVudHMgb2YgdGhlIElBQlIsCSovCisJLyogYW4gZXhjZXB0aW9uIGlzIGdlbmVyYXRlZCAoYmVmb3JlIHRoZSBpbnN0cnVjdGlvbiBhdCB0aGF0CSovCisJLyogbG9jYXRpb24gY29tcGxldGVzKS4gVGhlIHZlY3RvciBmb3IgdGhpcyBleGNlcHRpb24gaXMgMHgxMzAwICovCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisJbGlzCXIzLCBDT05GSUdfU1lTX0lNTVJAaAorCWx3eglyMywgMChyMykKKwltdHNwcglJQUJSLCByMworCisJLyogU2V0IHRoZSBlbnRpcmUgZHVhbCBwb3J0IFJBTSAod2hlcmUgdGhlIGluaXRpYWwgc3RhY2sJKi8KKwkvKiByZXNpZGVzKSB0byBhIGtub3duIHZhbHVlIC0gbWFrZXMgaXQgZWFzaWVyIHRvIHNlZSB3aGVyZQkqLworCS8qIHRoZSBzdGFjayBoYXMgYmVlbiB3cml0dGVuCQkJCQkqLworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCWxpcwlyMywgKENPTkZJR19TWVNfSU1NUiArIENPTkZJR19TWVNfSU5JVF9TUF9PRkZTRVQpQGgKKwlvcmkJcjMsIHIzLCAoQ09ORklHX1NZU19JTU1SICsgQ09ORklHX1NZU19JTklUX1NQX09GRlNFVClAbAorCWxpCXI0LCAoKENPTkZJR19TWVNfSU5JVF9TUF9PRkZTRVQgLSA0KSAvIDQpCisJbXRjdHIJcjQKKwlsaXMJcjQsIDB4ZGVhZGJlYWZAaAorCW9yaQlyNCwgcjQsIDB4ZGVhZGJlYWZAbAorMToKKwlzdHd1CXI0LCAtNChyMykKKwliZG56CTFiCisKKwkvKiBEb25lIQkJCQkJCQkqLworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJYmxyCisjZW5kaWYKKworLyogQ2FjaGUgZnVuY3Rpb25zLgorICoKKyAqIE5vdGU6IHJlcXVpcmVzIHRoYXQgYWxsIGNhY2hlIGJpdHMgaW4KKyAqIEhJRDAgYXJlIGluIHRoZSBsb3cgaGFsZiB3b3JkLgorICovCisJLmdsb2JsCWljYWNoZV9lbmFibGUKK2ljYWNoZV9lbmFibGU6CisJbWZzcHIJcjMsIEhJRDAKKwlvcmkJcjMsIHIzLCBISUQwX0lDRQorCWxpcwlyNCwgMAorCW9yaQlyNCwgcjQsIEhJRDBfSUxPQ0sKKwlhbmRjCXIzLCByMywgcjQKKwlvcmkJcjQsIHIzLCBISUQwX0lDRkkKKwlpc3luYworCW10c3ByCUhJRDAsIHI0CS8qIHNldHMgZW5hYmxlIGFuZCBpbnZhbGlkYXRlLCBjbGVhcnMgbG9jayAqLworCWlzeW5jCisJbXRzcHIJSElEMCwgcjMJLyogY2xlYXJzIGludmFsaWRhdGUgKi8KKwlibHIKKworCS5nbG9ibAlpY2FjaGVfZGlzYWJsZQoraWNhY2hlX2Rpc2FibGU6CisJbWZzcHIJcjMsIEhJRDAKKwlsaXMJcjQsIDAKKwlvcmkJcjQsIHI0LCBISUQwX0lDRXxISUQwX0lMT0NLCisJYW5kYwlyMywgcjMsIHI0CisJb3JpCXI0LCByMywgSElEMF9JQ0ZJCisJaXN5bmMKKwltdHNwcglISUQwLCByNAkvKiBzZXRzIGludmFsaWRhdGUsIGNsZWFycyBlbmFibGUgYW5kIGxvY2sgKi8KKwlpc3luYworCW10c3ByCUhJRDAsIHIzCS8qIGNsZWFycyBpbnZhbGlkYXRlICovCisJYmxyCisKKwkuZ2xvYmwJaWNhY2hlX3N0YXR1cworaWNhY2hlX3N0YXR1czoKKwltZnNwcglyMywgSElEMAorCXJsd2lubQlyMywgcjMsIEhJRDBfSUNFX0JJVFBPUyArIDEsIDMxLCAzMQorCWJscgorCisJLmdsb2JsCWRjYWNoZV9lbmFibGUKK2RjYWNoZV9lbmFibGU6CisJbWZzcHIJcjMsIEhJRDAKKwlvcmkJcjMsIHIzLCBISUQwX0RDRQorCWxpcwlyNCwgMAorCW9yaQlyNCwgcjQsIEhJRDBfRExPQ0sKKwlhbmRjCXIzLCByMywgcjQKKwlvcmkJcjQsIHIzLCBISUQwX0RDSQorCXN5bmMKKwltdHNwcglISUQwLCByNAkvKiBzZXRzIGVuYWJsZSBhbmQgaW52YWxpZGF0ZSwgY2xlYXJzIGxvY2sgKi8KKwlzeW5jCisJbXRzcHIJSElEMCwgcjMJLyogY2xlYXJzIGludmFsaWRhdGUgKi8KKwlibHIKKworCS5nbG9ibAlkY2FjaGVfZGlzYWJsZQorZGNhY2hlX2Rpc2FibGU6CisJbWZzcHIJcjMsIEhJRDAKKwlsaXMJcjQsIDAKKwlvcmkJcjQsIHI0LCBISUQwX0RDRXxISUQwX0RMT0NLCisJYW5kYwlyMywgcjMsIHI0CisJb3JpCXI0LCByMywgSElEMF9EQ0kKKwlzeW5jCisJbXRzcHIJSElEMCwgcjQJLyogc2V0cyBpbnZhbGlkYXRlLCBjbGVhcnMgZW5hYmxlIGFuZCBsb2NrICovCisJc3luYworCW10c3ByCUhJRDAsIHIzCS8qIGNsZWFycyBpbnZhbGlkYXRlICovCisJYmxyCisKKwkuZ2xvYmwJZGNhY2hlX3N0YXR1cworZGNhY2hlX3N0YXR1czoKKwltZnNwcglyMywgSElEMAorCXJsd2lubQlyMywgcjMsIEhJRDBfRENFX0JJVFBPUyArIDEsIDMxLCAzMQorCWJscgorCisJLmdsb2JsIGdldF9wdnIKK2dldF9wdnI6CisJbWZzcHIJcjMsIFBWUgorCWJscgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiB2b2lkIHJlbG9jYXRlX2NvZGUgKGFkZHJfc3AsIGdkLCBhZGRyX21vbmkpCisgKgorICogVGhpcyAiZnVuY3Rpb24iIGRvZXMgbm90IHJldHVybiwgaW5zdGVhZCBpdCBjb250aW51ZXMgaW4gUkFNCisgKiBhZnRlciByZWxvY2F0aW5nIHRoZSBtb25pdG9yIGNvZGUuCisgKgorICogcjMgPSBkZXN0CisgKiByNCA9IHNyYworICogcjUgPSBsZW5ndGggaW4gYnl0ZXMKKyAqIHI2ID0gY2FjaGVsaW5lc2l6ZQorICovCisJLmdsb2JsCXJlbG9jYXRlX2NvZGUKK3JlbG9jYXRlX2NvZGU6CisJbXIJcjEsICByMwkJLyogU2V0IG5ldyBzdGFjayBwb2ludGVyCQkqLworCW1yCXI5LCAgcjQJCS8qIFNhdmUgY29weSBvZiBHbG9iYWwgRGF0YSBwb2ludGVyCSovCisJbXIJcjEwLCByNQkJLyogU2F2ZSBjb3B5IG9mIERlc3RpbmF0aW9uIEFkZHJlc3MJKi8KKworCUdFVF9HT1QKKwltcglyMywgIHI1CQkJCS8qIERlc3RpbmF0aW9uIEFkZHJlc3MJKi8KKwlsaXMJcjQsIENPTkZJR19TWVNfTU9OSVRPUl9CQVNFQGgJCS8qIFNvdXJjZSAgICAgIEFkZHJlc3MJKi8KKwlvcmkJcjQsIHI0LCBDT05GSUdfU1lTX01PTklUT1JfQkFTRUBsCisJbHd6CXI1LCBHT1QoX19pbml0X2VuZCkKKwlzdWIJcjUsIHI1LCByNAorCWxpCXI2LCBDT05GSUdfU1lTX0NBQ0hFTElORV9TSVpFCQkvKiBDYWNoZSBMaW5lIFNpemUJKi8KKworCS8qCisJICogRml4IEdPVCBwb2ludGVyOgorCSAqCisJICogTmV3IEdPVC1QVFIgPSAob2xkIEdPVC1QVFIgLSBDT05GSUdfU1lTX01PTklUT1JfQkFTRSkgKyBEZXN0aW5hdGlvbiBBZGRyZXNzCisJICoKKwkgKiBPZmZzZXQ6CisJICovCisJc3ViCXIxNSwgcjEwLCByNAorCisJLyogRmlyc3Qgb3VyIG93biBHT1QgKi8KKwlhZGQJcjEyLCByMTIsIHIxNQorCS8qIHRoZW4gdGhlIG9uZSB1c2VkIGJ5IHRoZSBDIGNvZGUgKi8KKwlhZGQJcjMwLCByMzAsIHIxNQorCisJLyoKKwkgKiBOb3cgcmVsb2NhdGUgY29kZQorCSAqLworCisJY21wbHcJY3IxLHIzLHI0CisJYWRkaQlyMCxyNSwzCisJc3J3aS4JcjAscjAsMgorCWJlcQljcjEsNGYJCS8qIEluIHBsYWNlIGNvcHkgaXMgbm90IG5lY2Vzc2FyeQkqLworCWJlcQk3ZgkJLyogUHJvdGVjdCBhZ2FpbnN0IDAgY291bnQJCSovCisJbXRjdHIJcjAKKwliZ2UJY3IxLDJmCisKKwlsYQlyOCwtNChyNCkKKwlsYQlyNywtNChyMykKKzE6CWx3enUJcjAsNChyOCkKKwlzdHd1CXIwLDQocjcpCisJYmRuegkxYgorCWIJNGYKKworMjoJc2x3aQlyMCxyMCwyCisJYWRkCXI4LHI0LHIwCisJYWRkCXI3LHIzLHIwCiszOglsd3p1CXIwLC00KHI4KQorCXN0d3UJcjAsLTQocjcpCisJYmRuegkzYgorCisvKgorICogTm93IGZsdXNoIHRoZSBjYWNoZTogbm90ZSB0aGF0IHdlIG11c3Qgc3RhcnQgZnJvbSBhIGNhY2hlIGFsaWduZWQKKyAqIGFkZHJlc3MuIE90aGVyd2lzZSB3ZSBtaWdodCBtaXNzIG9uZSBjYWNoZSBsaW5lLgorICovCis0OgljbXB3aQlyNiwwCisJYWRkCXI1LHIzLHI1CisJYmVxCTdmCQkvKiBBbHdheXMgZmx1c2ggcHJlZmV0Y2ggcXVldWUgaW4gYW55IGNhc2UgKi8KKwlzdWJpCXIwLHI2LDEKKwlhbmRjCXIzLHIzLHIwCisJbWZzcHIJcjcsSElEMAkJLyogZG9uJ3QgZG8gZGNic3QgaWYgZGNhY2hlIGlzIGRpc2FibGVkICovCisJcmx3aW5tCXI3LHI3LEhJRDBfRENFX0JJVFBPUysxLDMxLDMxCisJY21wd2kJcjcsMAorCWJlcQk5ZgorCW1yCXI0LHIzCis1OglkY2JzdAkwLHI0CisJYWRkCXI0LHI0LHI2CisJY21wbHcJcjQscjUKKwlibHQJNWIKKwlzeW5jCQkJLyogV2FpdCBmb3IgYWxsIGRjYnN0IHRvIGNvbXBsZXRlIG9uIGJ1cyAqLworOToJbWZzcHIJcjcsSElEMAkJLyogZG9uJ3QgZG8gaWNiaSBpZiBpY2FjaGUgaXMgZGlzYWJsZWQgKi8KKwlybHdpbm0JcjcscjcsSElEMF9JQ0VfQklUUE9TKzEsMzEsMzEKKwljbXB3aQlyNywwCisJYmVxCTdmCisJbXIJcjQscjMKKzY6CWljYmkJMCxyNAorCWFkZAlyNCxyNCxyNgorCWNtcGx3CXI0LHI1CisJYmx0CTZiCis3OglzeW5jCQkJLyogV2FpdCBmb3IgYWxsIGljYmkgdG8gY29tcGxldGUgb24gYnVzCSovCisJaXN5bmMKKworLyoKKyAqIFdlIGFyZSBkb25lLiBEbyBub3QgcmV0dXJuLCBpbnN0ZWFkIGJyYW5jaCB0byBzZWNvbmQgcGFydCBvZiBib2FyZAorICogaW5pdGlhbGl6YXRpb24sIG5vdyBydW5uaW5nIGZyb20gUkFNLgorICovCisKKwlhZGRpCXIwLCByMTAsIGluX3JhbSAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCisJbXRscglyMAorCWJscgorCitpbl9yYW06CisKKwkvKgorCSAqIFJlbG9jYXRpb24gRnVuY3Rpb24sIHIxMiBwb2ludCB0byBnb3QyKzB4ODAwMAorCSAqCisJICogQWRqdXN0IGdvdDIgcG9pbnRlcnMsIG5vIG5lZWQgdG8gY2hlY2sgZm9yIDAsIHRoaXMgY29kZQorCSAqIGFscmVhZHkgcHV0cyBhIGZldyBlbnRyaWVzIGluIHRoZSB0YWJsZS4KKwkgKi8KKwlsaQlyMCxfX2dvdDJfZW50cmllc0BzZWN0b2ZmQGwKKwlsYQlyMyxHT1QoX0dPVDJfVEFCTEVfKQorCWx3eglyMTEsR09UKF9HT1QyX1RBQkxFXykKKwltdGN0cglyMAorCXN1YglyMTEscjMscjExCisJYWRkaQlyMyxyMywtNAorMToJbHd6dQlyMCw0KHIzKQorCWNtcHdpCXIwLDAKKwliZXEtCTJmCisJYWRkCXIwLHIwLHIxMQorCXN0dwlyMCwwKHIzKQorMjoJYmRuegkxYgorCisJLyoKKwkgKiBOb3cgYWRqdXN0IHRoZSBmaXh1cHMgYW5kIHRoZSBwb2ludGVycyB0byB0aGUgZml4dXBzCisJICogaW4gY2FzZSB3ZSBuZWVkIHRvIG1vdmUgb3Vyc2VsdmVzIGFnYWluLgorCSAqLworCWxpCXIwLF9fZml4dXBfZW50cmllc0BzZWN0b2ZmQGwKKwlsd3oJcjMsR09UKF9GSVhVUF9UQUJMRV8pCisJY21wd2kJcjAsMAorCW10Y3RyCXIwCisJYWRkaQlyMyxyMywtNAorCWJlcQk0ZgorMzoJbHd6dQlyNCw0KHIzKQorCWx3enV4CXIwLHI0LHIxMQorCWFkZAlyMCxyMCxyMTEKKwlzdHcJcjEwLDAocjMpCisJc3R3CXIwLDAocjQpCisJYmRuegkzYgorNDoKK2NsZWFyX2JzczoKKwkvKgorCSAqIE5vdyBjbGVhciBCU1Mgc2VnbWVudAorCSAqLworCWx3eglyMyxHT1QoX19ic3Nfc3RhcnQpCisjaWYgZGVmaW5lZChDT05GSUdfSFlNT0QpCisJLyoKKwkgKiBGb3IgSFlNT0QgLSB0aGUgZW52aXJvbm1lbnQgaXMgdGhlIHZlcnkgbGFzdCBpdGVtIGluIGZsYXNoLgorCSAqIFRoZSByZWFsIC5ic3Mgc3RvcHMganVzdCBiZWZvcmUgZW52aXJvbm1lbnQgc3RhcnRzLCBzbyBvbmx5CisJICogY2xlYXIgdXAgdG8gdGhhdCBwb2ludC4KKwkgKgorCSAqIHRha2VuIGZyb20gbW9kcyBmb3IgRkFEUyBib2FyZAorCSAqLworCWx3eglyNCxHT1QoZW52aXJvbm1lbnQpCisjZWxzZQorCWx3eglyNCxHT1QoX2VuZCkKKyNlbmRpZgorCisJY21wbHcJMCwgcjMsIHI0CisJYmVxCTZmCisKKwlsaQlyMCwgMAorNToKKwlzdHcJcjAsIDAocjMpCisJYWRkaQlyMywgcjMsIDQKKwljbXBsdwkwLCByMywgcjQKKwlibmUJNWIKKzY6CisKKwltcglyMywgcjkJCS8qIEdsb2JhbCBEYXRhIHBvaW50ZXIJCSovCisJbXIJcjQsIHIxMAkJLyogRGVzdGluYXRpb24gQWRkcmVzcwkJKi8KKwlibAlib2FyZF9pbml0X3IKKworCS8qCisJICogQ29weSBleGNlcHRpb24gdmVjdG9yIGNvZGUgdG8gbG93IG1lbW9yeQorCSAqCisJICogcjM6IGRlc3RfYWRkcgorCSAqIHI3OiBzb3VyY2UgYWRkcmVzcywgcjg6IGVuZCBhZGRyZXNzLCByOTogdGFyZ2V0IGFkZHJlc3MKKwkgKi8KKwkuZ2xvYmwJdHJhcF9pbml0Cit0cmFwX2luaXQ6CisJbWZscglyNAkJCS8qIHNhdmUgbGluayByZWdpc3RlcgkJKi8KKwlHRVRfR09UCisJbHd6CXI3LCBHT1QoX3N0YXJ0KQorCWx3eglyOCwgR09UKF9lbmRfb2ZfdmVjdG9ycykKKworCWxpCXI5LCAweDEwMAkJLyogcmVzZXQgdmVjdG9yIGFsd2F5cyBhdCAweDEwMCAqLworCisJY21wbHcJMCwgcjcsIHI4CisJYmdlbHIJCQkJLyogcmV0dXJuIGlmIHI3Pj1yOCAtIGp1c3QgaW4gY2FzZSAqLworMToKKwlsd3oJcjAsIDAocjcpCisJc3R3CXIwLCAwKHI5KQorCWFkZGkJcjcsIHI3LCA0CisJYWRkaQlyOSwgcjksIDQKKwljbXBsdwkwLCByNywgcjgKKwlibmUJMWIKKworCS8qCisJICogcmVsb2NhdGUgYGhkbHInIGFuZCBgaW50X3JldHVybicgZW50cmllcworCSAqLworCWxpCXI3LCAuTF9NYWNoaW5lQ2hlY2sgLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorCWxpCXI4LCBBbGlnbm1lbnQgLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorMjoKKwlibAl0cmFwX3JlbG9jCisJYWRkaQlyNywgcjcsIDB4MTAwCQkvKiBuZXh0IGV4Y2VwdGlvbiB2ZWN0b3IJKi8KKwljbXBsdwkwLCByNywgcjgKKwlibHQJMmIKKworCWxpCXI3LCAuTF9BbGlnbm1lbnQgLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorCWJsCXRyYXBfcmVsb2MKKworCWxpCXI3LCAuTF9Qcm9ncmFtQ2hlY2sgLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorCWJsCXRyYXBfcmVsb2MKKworCWxpCXI3LCAuTF9GUFVuYXZhaWxhYmxlIC0gX3N0YXJ0ICsgRVhDX09GRl9TWVNfUkVTRVQKKwlsaQlyOCwgU3lzdGVtQ2FsbCAtIF9zdGFydCArIEVYQ19PRkZfU1lTX1JFU0VUCiszOgorCWJsCXRyYXBfcmVsb2MKKwlhZGRpCXI3LCByNywgMHgxMDAJCS8qIG5leHQgZXhjZXB0aW9uIHZlY3RvcgkqLworCWNtcGx3CTAsIHI3LCByOAorCWJsdAkzYgorCisJbGkJcjcsIC5MX1NpbmdsZVN0ZXAgLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorCWxpCXI4LCBfZW5kX29mX3ZlY3RvcnMgLSBfc3RhcnQgKyBFWENfT0ZGX1NZU19SRVNFVAorNDoKKwlibAl0cmFwX3JlbG9jCisJYWRkaQlyNywgcjcsIDB4MTAwCQkvKiBuZXh0IGV4Y2VwdGlvbiB2ZWN0b3IJKi8KKwljbXBsdwkwLCByNywgcjgKKwlibHQJNGIKKworCW1mbXNyCXIzCQkJLyogbm93IHRoYXQgdGhlIHZlY3RvcnMgaGF2ZQkqLworCWxpcwlyNywgTVNSX0lQQGgJCS8qIHJlbG9jYXRlZCBpbnRvIGxvdyBtZW1vcnkJKi8KKwlvcmkJcjcsIHI3LCBNU1JfSVBAbAkvKiBNU1JbSVBdIGNhbiBiZSB0dXJuZWQgb2ZmCSovCisJYW5kYwlyMywgcjMsIHI3CQkvKiAoaWYgaXQgd2FzIG9uKQkJKi8KKwlTWU5DCQkJCS8qIFNvbWUgY2hpcCByZXZzIG5lZWQgdGhpcy4uLiAqLworCW10bXNyCXIzCisJU1lOQworCisJbXRscglyNAkJCS8qIHJlc3RvcmUgbGluayByZWdpc3RlciAgICAqLworCWJscgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjYwL3RyYXBzLmMgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgyNjAvdHJhcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTE2Y2RmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjYwL3RyYXBzLmMKQEAgLTAsMCArMSwyNzMgQEAKKy8qCisgKiBsaW51eC9hcmNoL3Bvd2VycGMva2VybmVsL3RyYXBzLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NiAgR2FyeSBUaG9tYXMgKGdkdEBsaW51eHBwYy5vcmcpCisgKgorICogTW9kaWZpZWQgYnkgQ29ydCBEb3VnYW4gKGNvcnRAY3Mubm10LmVkdSkKKyAqIGFuZCBQYXVsIE1hY2tlcnJhcyAocGF1bHVzQGNzLmFudS5lZHUuYXUpCisgKgorICogKEMpIENvcHlyaWdodCAyMDAwCisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qCisgKiBUaGlzIGZpbGUgaGFuZGxlcyB0aGUgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBwYXJ0cyBvZiBoYXJkd2FyZSBleGNlcHRpb25zCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlIDxrZ2RiLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9tODI2MF9wY2kuaD4KKworLyogUmV0dXJucyAwIGlmIGV4Y2VwdGlvbiBub3QgZm91bmQgYW5kIGZpeHVwIG90aGVyd2lzZS4gICovCitleHRlcm4gdW5zaWduZWQgbG9uZyBzZWFyY2hfZXhjZXB0aW9uX3RhYmxlKHVuc2lnbmVkIGxvbmcpOworCisvKiBUSElTIE5FRURTIENIQU5HSU5HIHRvIHVzZSB0aGUgYm9hcmQgaW5mbyBzdHJ1Y3R1cmUuCisqLworI2RlZmluZSBFTkRfT0ZfTUVNCTB4MDIwMDAwMDAKKworLyoKKyAqIFRyYXAgJiBFeGNlcHRpb24gc3VwcG9ydAorICovCisKK3ZvaWQKK3ByaW50X2JhY2t0cmFjZSh1bnNpZ25lZCBsb25nICpzcCkKK3sKKwlpbnQgY250ID0gMDsKKwl1bnNpZ25lZCBsb25nIGk7CisKKwlwdXRzICgiQ2FsbCBiYWNrdHJhY2U6ICIpOworCXdoaWxlIChzcCkgeworCQlpZiAoKHVpbnQpc3AgPiBFTkRfT0ZfTUVNKQorCQkJYnJlYWs7CisKKwkJaSA9IHNwWzFdOworCQlpZiAoY250KysgJSA3ID09IDApCisJCQlwdXRjICgnXG4nKTsKKwkJcHJpbnRmKCIlMDhsWCAiLCBpKTsKKwkJaWYgKGNudCA+IDMyKSBicmVhazsKKwkJc3AgPSAodW5zaWduZWQgbG9uZyAqKSpzcDsKKwl9CisJcHV0YyAoJ1xuJyk7Cit9CisKK3ZvaWQgc2hvd19yZWdzKHN0cnVjdCBwdF9yZWdzICogcmVncykKK3sKKwlpbnQgaTsKKworCXByaW50ZigiTklQOiAlMDhsWCBYRVI6ICUwOGxYIExSOiAlMDhsWCBSRUdTOiAlcCBUUkFQOiAlMDRseCBEQVI6ICUwOGxYXG4iLAorCSAgICAgICByZWdzLT5uaXAsIHJlZ3MtPnhlciwgcmVncy0+bGluaywgcmVncywgcmVncy0+dHJhcCwgcmVncy0+ZGFyKTsKKwlwcmludGYoIk1TUjogJTA4bHggRUU6ICUwMXggUFI6ICUwMXggRlA6ICUwMXggTUU6ICUwMXggSVIvRFI6ICUwMXglMDF4XG4iLAorCSAgICAgICByZWdzLT5tc3IsIHJlZ3MtPm1zciZNU1JfRUUgPyAxIDogMCwgcmVncy0+bXNyJk1TUl9QUiA/IDEgOiAwLAorCSAgICAgICByZWdzLT5tc3IgJiBNU1JfRlAgPyAxIDogMCxyZWdzLT5tc3ImTVNSX01FID8gMSA6IDAsCisJICAgICAgIHJlZ3MtPm1zciZNU1JfSVIgPyAxIDogMCwKKwkgICAgICAgcmVncy0+bXNyJk1TUl9EUiA/IDEgOiAwKTsKKworCXB1dGMgKCdcbicpOworCWZvciAoaSA9IDA7ICBpIDwgMzI7ICBpKyspIHsKKwkJaWYgKChpICUgOCkgPT0gMCkgeworCQkJcHJpbnRmKCJHUFIlMDJkOiAiLCBpKTsKKwkJfQorCisJCXByaW50ZigiJTA4bFggIiwgcmVncy0+Z3ByW2ldKTsKKwkJaWYgKChpICUgOCkgPT0gNykgeworCQkJcHV0YyAoJ1xuJyk7CisJCX0KKwl9Cit9CisKKwordm9pZAorX2V4Y2VwdGlvbihpbnQgc2lnbnIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXNob3dfcmVncyhyZWdzKTsKKwlwcmludF9iYWNrdHJhY2UoKHVuc2lnbmVkIGxvbmcgKilyZWdzLT5ncHJbMV0pOworCXBhbmljKCJFeGNlcHRpb24gaW4ga2VybmVsIHBjICVseCBzaWduYWwgJWQiLHJlZ3MtPm5pcCxzaWducik7Cit9CisKKyNpZmRlZiBDT05GSUdfUENJCit2b2lkIGR1bXBfcGNpICh2b2lkKQoreworCisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tYXAgPSAoaW1tYXBfdCAqKSBDT05GSUdfU1lTX0lNTVI7CisKKwlwcmludGYgKCJQQ0k6IGVyciBzdGF0dXMgJXggZXJyIG1hc2sgJXggZXJyIGN0cmwgJXhcbiIsCisJCWxlMzJfdG9fY3B1IChpbW1hcC0+aW1fcGNpLnBjaV9lc3IpLAorCQlsZTMyX3RvX2NwdSAoaW1tYXAtPmltX3BjaS5wY2lfZW1yKSwKKwkJbGUzMl90b19jcHUgKGltbWFwLT5pbV9wY2kucGNpX2VjcikpOworCXByaW50ZiAoIiAgICAgZXJyb3IgYWRkcmVzcyAleCBlcnJvciBkYXRhICV4IGN0cmwgJXhcbiIsCisJCWxlMzJfdG9fY3B1IChpbW1hcC0+aW1fcGNpLnBjaV9lYWNyKSwKKwkJbGUzMl90b19jcHUgKGltbWFwLT5pbV9wY2kucGNpX2VkY3IpLAorCQlsZTMyX3RvX2NwdSAoaW1tYXAtPmltX3BjaS5wY2lfZWNjcikpOworCit9CisjZW5kaWYKKwordm9pZAorTWFjaGluZUNoZWNrRXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuc2lnbmVkIGxvbmcgZml4dXA7CisKKwkvKiBQcm9iaW5nIFBDSSB1c2luZyBjb25maWcgY3ljbGVzIGNhdXNlIHRoaXMgZXhjZXB0aW9uCisJICogd2hlbiBhIGRldmljZSBpcyBub3QgcHJlc2VudC4gIENhdGNoIGl0IGFuZCByZXR1cm4gdG8KKwkgKiB0aGUgUENJIGV4Y2VwdGlvbiBoYW5kbGVyLgorCSAqLworI2lmZGVmIENPTkZJR19QQ0kKKwl2b2xhdGlsZSBpbW1hcF90ICppbW1hcCAgPSAoaW1tYXBfdCAqKUNPTkZJR19TWVNfSU1NUjsKKyNpZmRlZiBERUJVRworCWR1bXBfcGNpKCk7CisjZW5kaWYKKwkvKiBjbGVhciB0aGUgZXJyb3IgaW4gdGhlIGVycm9yIHN0YXR1cyByZWdpc3RlciAqLworCWlmKGltbWFwLT5pbV9wY2kucGNpX2VzciAmIGNwdV90b19sZTMyKFBDSV9FUlJPUl9QQ0lfTk9fUlNQKSkgeworCQlpbW1hcC0+aW1fcGNpLnBjaV9lc3IgPSBjcHVfdG9fbGUzMihQQ0lfRVJST1JfUENJX05PX1JTUCk7CisJCXJldHVybjsKKwl9CisjZW5kaWYKKwlpZiAoKGZpeHVwID0gc2VhcmNoX2V4Y2VwdGlvbl90YWJsZShyZWdzLT5uaXApKSAhPSAwKSB7CisJCXJlZ3MtPm5pcCA9IGZpeHVwOworCQlyZXR1cm47CisJfQorCisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0tHREIpCisJaWYgKGRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyICYmICgqZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIpKHJlZ3MpKQorCQlyZXR1cm47CisjZW5kaWYKKworCXB1dHMgKCJNYWNoaW5lIGNoZWNrIGluIGtlcm5lbCBtb2RlLlxuIgorCQkiQ2F1c2VkIGJ5IChmcm9tIG1zcik6ICIpOworCXByaW50ZigicmVncyAlcCAiLHJlZ3MpOworCXN3aXRjaCggcmVncy0+bXNyICYgMHgwMDBGMDAwMCkgeworCWNhc2UgKDB4ODAwMDAwMDA+PjEyKToKKwkJcHV0cyAoIk1hY2hpbmUgY2hlY2sgc2lnbmFsIC0gcHJvYmFibHkgZHVlIHRvIG1tIGZhdWx0XG4iCisJCQkid2l0aCBtbXUgb2ZmXG4iKTsKKwkJYnJlYWs7CisJY2FzZSAoMHg4MDAwMDAwMD4+MTMpOgorCQlwdXRzICgiVHJhbnNmZXIgZXJyb3IgYWNrIHNpZ25hbFxuIik7CisJCWJyZWFrOworCWNhc2UgKDB4ODAwMDAwMDA+PjE0KToKKwkJcHV0cyAoIkRhdGEgcGFyaXR5IHNpZ25hbFxuIik7CisJCWJyZWFrOworCWNhc2UgKDB4ODAwMDAwMDA+PjE1KToKKwkJcHV0cyAoIkFkZHJlc3MgcGFyaXR5IHNpZ25hbFxuIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXB1dHMgKCJVbmtub3duIHZhbHVlcyBpbiBtc3JcbiIpOworCX0KKwlzaG93X3JlZ3MocmVncyk7CisJcHJpbnRfYmFja3RyYWNlKCh1bnNpZ25lZCBsb25nICopcmVncy0+Z3ByWzFdKTsKKyNpZmRlZiBDT05GSUdfUENJCisJZHVtcF9wY2koKTsKKyNlbmRpZgorCXBhbmljKCJtYWNoaW5lIGNoZWNrIik7Cit9CisKK3ZvaWQKK0FsaWdubWVudEV4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKKwlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikocmVncykpCisJCXJldHVybjsKKyNlbmRpZgorCXNob3dfcmVncyhyZWdzKTsKKwlwcmludF9iYWNrdHJhY2UoKHVuc2lnbmVkIGxvbmcgKilyZWdzLT5ncHJbMV0pOworCXBhbmljKCJBbGlnbm1lbnQgRXhjZXB0aW9uIik7Cit9CisKK3ZvaWQKK1Byb2dyYW1DaGVja0V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfS0dEQikKKwlpZiAoZGVidWdnZXJfZXhjZXB0aW9uX2hhbmRsZXIgJiYgKCpkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlcikocmVncykpCisJCXJldHVybjsKKyNlbmRpZgorCXNob3dfcmVncyhyZWdzKTsKKwlwcmludF9iYWNrdHJhY2UoKHVuc2lnbmVkIGxvbmcgKilyZWdzLT5ncHJbMV0pOworCXBhbmljKCJQcm9ncmFtIENoZWNrIEV4Y2VwdGlvbiIpOworfQorCit2b2lkCitTb2Z0RW11RXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQorCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShyZWdzKSkKKwkJcmV0dXJuOworI2VuZGlmCisJc2hvd19yZWdzKHJlZ3MpOworCXByaW50X2JhY2t0cmFjZSgodW5zaWduZWQgbG9uZyAqKXJlZ3MtPmdwclsxXSk7CisJcGFuaWMoIlNvZnR3YXJlIEVtdWxhdGlvbiBFeGNlcHRpb24iKTsKK30KKworCit2b2lkCitVbmtub3duRXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9LR0RCKQorCWlmIChkZWJ1Z2dlcl9leGNlcHRpb25faGFuZGxlciAmJiAoKmRlYnVnZ2VyX2V4Y2VwdGlvbl9oYW5kbGVyKShyZWdzKSkKKwkJcmV0dXJuOworI2VuZGlmCisJcHJpbnRmKCJCYWQgdHJhcCBhdCBQQzogJWx4LCBTUjogJWx4LCB2ZWN0b3I9JWx4XG4iLAorCSAgICAgICByZWdzLT5uaXAsIHJlZ3MtPm1zciwgcmVncy0+dHJhcCk7CisJX2V4Y2VwdGlvbigwLCByZWdzKTsKK30KKworI2lmIGRlZmluZWQoQ09ORklHX0NNRF9CRURCVUcpCitleHRlcm4gdm9pZCBkb19iZWRidWdfYnJlYWtwb2ludChzdHJ1Y3QgcHRfcmVncyAqKTsKKyNlbmRpZgorCit2b2lkCitEZWJ1Z0V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKworICBwcmludGYoIkRlYnVnZ2VyIHRyYXAgYXQgQCAlbHhcbiIsIHJlZ3MtPm5pcCApOworICBzaG93X3JlZ3MocmVncyk7CisjaWYgZGVmaW5lZChDT05GSUdfQ01EX0JFREJVRykKKyAgZG9fYmVkYnVnX2JyZWFrcG9pbnQoIHJlZ3MgKTsKKyNlbmRpZgorfQorCisvKiBQcm9iZSBhbiBhZGRyZXNzIGJ5IHJlYWRpbmcuICBJZiBub3QgcHJlc2VudCwgcmV0dXJuIC0xLCBvdGhlcndpc2UKKyAqIHJldHVybiAwLgorICovCitpbnQKK2FkZHJfcHJvYmUodWludCAqYWRkcikKK3sKKyNpZiAwCisJaW50CXJldHZhbDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCVwKKwkJIjE6CWx3eiAlMCwwKCUxKVxuIgkJXAorCQkiCWVpZWlvXG4iCQlcCisJCSIJbGkgJTAsMFxuIgkJXAorCQkiMjpcbiIJCQkJXAorCQkiLnNlY3Rpb24gLmZpeHVwLFwiYXhcIlxuIglcCisJCSIzOglsaSAlMCwtMVxuIgkJXAorCQkiCWIgMmJcbiIJCQlcCisJCSIuc2VjdGlvbiBfX2V4X3RhYmxlLFwiYVwiXG4iCVwKKwkJIgkuYWxpZ24gMlxuIgkJXAorCQkiCS5sb25nIDFiLDNiXG4iCQlcCisJCSIudGV4dCIJCQkJXAorCQk6ICI9ciIgKHJldHZhbCkgOiAiciIoYWRkcikpOworCisJcmV0dXJuIChyZXR2YWwpOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3B1L21wYzgyNjAvdS1ib290LmxkcyBiL2FyY2gvcG93ZXJwYy9jcHUvbXBjODI2MC91LWJvb3QubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NjgxZTcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3B1L21wYzgyNjAvdS1ib290LmxkcwpAQCAtMCwwICsxLDEyMiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMS0yMDA3CisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKK09VVFBVVF9BUkNIKHBvd2VycGMpCisvKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmPworICAgX19EWU5BTUlDID0gMDsgICAgKi8KK1NFQ1RJT05TCit7CisgIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLworICAuID0gKyBTSVpFT0ZfSEVBREVSUzsKKyAgLmludGVycCA6IHsgKiguaW50ZXJwKSB9CisgIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQorICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQorICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQorICAucmVsLnRleHQgICAgICA6IHsgKigucmVsLnRleHQpCQl9CisgIC5yZWxhLnRleHQgICAgIDogeyAqKC5yZWxhLnRleHQpCX0KKyAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfQorICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKQl9CisgIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKQl9CisgIC5yZWxhLnJvZGF0YSAgIDogeyAqKC5yZWxhLnJvZGF0YSkJfQorICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX0KKyAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfQorICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9CisgIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9CisgIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX0KKyAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX0KKyAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9CisgIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX0KKyAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9CisgIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX0KKyAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0KKyAgLnBsdCA6IHsgKigucGx0KSB9CisgIC50ZXh0ICAgICAgOgorICB7CisgICAgYXJjaC9wb3dlcnBjL2NwdS9tcGM4MjYwL3N0YXJ0Lm8JCSgudGV4dCkKKyAgICAqKC50ZXh0KQorICAgICooLmdvdDEpCisgICAgLiA9IEFMSUdOKDE2KTsKKyAgICAqKC5laF9mcmFtZSkKKyAgICAqKFNPUlRfQllfQUxJR05NRU5UKFNPUlRfQllfTkFNRSgucm9kYXRhKikpKQorICB9CisgIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTAKKyAgLmN0b3JzICAgICA6IHsgKiguY3RvcnMpICAgfQorICAuZHRvcnMgICAgIDogeyAqKC5kdG9ycykgICB9CisKKyAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCisgIC4gPSAoLiArIDB4MEZGRikgJiAweEZGRkZGMDAwOworICBfZXJvdGV4dCA9IC47CisgIFBST1ZJREUgKGVyb3RleHQgPSAuKTsKKyAgLnJlbG9jICAgOgorICB7CisgICAgKiguZ290KQorICAgIF9HT1QyX1RBQkxFXyA9IC47CisgICAgKiguZ290MikKKyAgICBfRklYVVBfVEFCTEVfID0gLjsKKyAgICAqKC5maXh1cCkKKyAgfQorICBfX2dvdDJfZW50cmllcyA9IChfRklYVVBfVEFCTEVfIC0gX0dPVDJfVEFCTEVfKSA+PiAyOworICBfX2ZpeHVwX2VudHJpZXMgPSAoLiAtIF9GSVhVUF9UQUJMRV8pID4+IDI7CisKKyAgLmRhdGEgICAgOgorICB7CisgICAgKiguZGF0YSkKKyAgICAqKC5kYXRhMSkKKyAgICAqKC5zZGF0YSkKKyAgICAqKC5zZGF0YTIpCisgICAgKiguZHluYW1pYykKKyAgICBDT05TVFJVQ1RPUlMKKyAgfQorICBfZWRhdGEgID0gIC47CisgIFBST1ZJREUgKGVkYXRhID0gLik7CisKKyAgLiA9IC47CisgIF9fdV9ib290X2NtZF9zdGFydCA9IC47CisgIC51X2Jvb3RfY21kIDogeyAqKC51X2Jvb3RfY21kKSB9CisgIF9fdV9ib290X2NtZF9lbmQgPSAuOworCisKKyAgLiA9IC47CisgIF9fc3RhcnRfX19leF90YWJsZSA9IC47CisgIF9fZXhfdGFibGUgOiB7ICooX19leF90YWJsZSkgfQorICBfX3N0b3BfX19leF90YWJsZSA9IC47CisKKyAgLiA9IEFMSUdOKDQwOTYpOworICBfX2luaXRfYmVnaW4gPSAuOworICAudGV4dC5pbml0IDogeyAqKC50ZXh0LmluaXQpIH0KKyAgLmRhdGEuaW5pdCA6IHsgKiguZGF0YS5pbml0KSB9CisgIC4gPSBBTElHTig0MDk2KTsKKyAgX19pbml0X2VuZCA9IC47CisKKyAgX19ic3Nfc3RhcnQgPSAuOworICAuYnNzIChOT0xPQUQpICAgICAgIDoKKyAgeworICAgKiguc2JzcykgKiguc2NvbW1vbikKKyAgICooLmR5bmJzcykKKyAgICooLmJzcykKKyAgICooQ09NTU9OKQorICAgLiA9IEFMSUdOKDQpOworICB9CisgIF9lbmQgPSAuIDsKKyAgUFJPVklERSAoZW5kID0gLik7Cit9Cg==