ZGlmZiAtLWdpdCBhL2F1dG8vY2MvZ2NjIGIvYXV0by9jYy9nY2MKaW5kZXggZDViZjFkYy4uMjRiOTA4ZCAxMDA2NDQKLS0tIGEvYXV0by9jYy9nY2MKKysrIGIvYXV0by9jYy9nY2MKQEAgLTI4LDYgKzI4LDcgQEAKICMgb3B0aW1pemF0aW9ucwogCiAjQ0ZMQUdTPSIkQ0ZMQUdTIC1PMiAtZm9taXQtZnJhbWUtcG9pbnRlciIKKyNDRkxBR1M9IiRDRkxBR1MgLU9zIC1mb21pdC1mcmFtZS1wb2ludGVyIgogCiBjYXNlICRDUFUgaW4KICAgICBwZW50aXVtKQpkaWZmIC0tZ2l0IGEvYXV0by9tb2R1bGVzIGIvYXV0by9tb2R1bGVzCmluZGV4IDMyMjFlMjYuLjM3NWI3NTUgMTAwNjQ0Ci0tLSBhL2F1dG8vbW9kdWxlcworKysgYi9hdXRvL21vZHVsZXMKQEAgLTExNiw2ICsxMTYsMTIgQEAKICAgICBIVFRQX1NSQ1M9IiRIVFRQX1NSQ1MgJEhUVFBfU1RBVFVTX1NSQ1MiCiBmaQogCitpZiBbICRIVFRQX0dFTyA9IFlFUyBdOyB0aGVuCisgICAgaGF2ZT1OR1hfSFRUUF9HRU8gLiBhdXRvL2hhdmUKKyAgICBIVFRQX01PRFVMRVM9IiRIVFRQX01PRFVMRVMgJEhUVFBfR0VPX01PRFVMRSIKKyAgICBIVFRQX1NSQ1M9IiRIVFRQX1NSQ1MgJEhUVFBfR0VPX1NSQ1MiCitmaQorCiBpZiBbICRIVFRQX1JFV1JJVEUgPSBZRVMgLWEgJFVTRV9QQ1JFICE9IERJU0FCTEVEIF07IHRoZW4KICAgICBoYXZlPU5HWF9IVFRQX1JFV1JJVEUgLiBhdXRvL2hhdmUKICAgICBVU0VfUENSRT1ZRVMKZGlmZiAtLWdpdCBhL2F1dG8vb3B0aW9ucyBiL2F1dG8vb3B0aW9ucwppbmRleCAzZDU1MmRmLi45YWZmNmUyIDEwMDY0NAotLS0gYS9hdXRvL29wdGlvbnMKKysrIGIvYXV0by9vcHRpb25zCkBAIC01Myw2ICs1Myw3IEBACiBIVFRQX1VTRVJJRD1ZRVMKIEhUVFBfQVVUT0lOREVYPVlFUwogSFRUUF9TVEFUVVM9Tk8KK0hUVFBfR0VPPVlFUwogSFRUUF9SRVdSSVRFPVlFUwogSFRUUF9QUk9YWT1ZRVMKIEhUVFBfRkFTVENHST1ZRVMKQEAgLTEyNSw2ICsxMjYsNyBAQAogICAgICAgICAtLXdpdGhvdXQtaHR0cF9hY2Nlc3NfbW9kdWxlKSAgICBIVFRQX0FDQ0VTUz1OTyAgICAgICAgICAgICA7OwogICAgICAgICAtLXdpdGhvdXQtaHR0cF9hdXRvaW5kZXhfbW9kdWxlKSBIVFRQX0FVVE9JTkRFWD1OTyAgICAgICAgICA7OwogICAgICAgICAtLXdpdGhvdXQtaHR0cF9zdGF0dXNfbW9kdWxlKSAgICBIVFRQX1NUQVRVUz1OTyAgICAgICAgICAgICA7OworICAgICAgICAtLXdpdGhvdXQtaHR0cF9nZW9fbW9kdWxlKSAgICAgICBIVFRQX0dFTz1OTyAgICAgICAgICAgICAgICA7OwogICAgICAgICAtLXdpdGhvdXQtaHR0cF9yZXdyaXRlX21vZHVsZSkgICBIVFRQX1JFV1JJVEU9Tk8gICAgICAgICAgICA7OwogICAgICAgICAtLXdpdGhvdXQtaHR0cF9wcm94eV9tb2R1bGUpICAgICBIVFRQX1BST1hZPU5PICAgICAgICAgICAgICA7OwogICAgICAgICAtLXdpdGhvdXQtaHR0cF9mYXN0Y2dpX21vZHVsZSkgICBIVFRQX0ZBU1RDR0k9Tk8gICAgICAgICAgICA7OwpAQCAtMTk4LDYgKzIwMCw3IEBACiAgIC0td2l0aG91dC1odHRwX3VzZXJpZF9tb2R1bGUgICAgICAgZGlzYWJsZSBuZ3hfaHR0cF91c2VyaWRfbW9kdWxlCiAgIC0td2l0aG91dC1odHRwX2FjY2Vzc19tb2R1bGUgICAgICAgZGlzYWJsZSBuZ3hfaHR0cF9hY2Nlc3NfbW9kdWxlCiAgIC0td2l0aG91dC1odHRwX2F1dG9pbmRleF9tb2R1bGUgICAgZGlzYWJsZSBuZ3hfaHR0cF9hdXRvaW5kZXhfbW9kdWxlCisgIC0td2l0aG91dC1odHRwX2dlb19tb2R1bGUgICAgICAgICAgZGlzYWJsZSBuZ3hfaHR0cF9nZW9fbW9kdWxlCiAgIC0td2l0aG91dC1odHRwX3Jld3JpdGVfbW9kdWxlICAgICAgZGlzYWJsZSBuZ3hfaHR0cF9yZXdyaXRlX21vZHVsZQogICAtLXdpdGhvdXQtaHR0cF9wcm94eV9tb2R1bGUgICAgICAgIGRpc2FibGUgbmd4X2h0dHBfcHJveHlfbW9kdWxlCiAgIC0td2l0aG91dC1odHRwX2Zhc3RjZ2lfbW9kdWxlICAgICAgZGlzYWJsZSBuZ3hfaHR0cF9mYXN0Y2dpX21vZHVsZQpkaWZmIC0tZ2l0IGEvYXV0by9zb3VyY2VzIGIvYXV0by9zb3VyY2VzCmluZGV4IGM2MWQ4M2EuLmFjMTc3ZjEgMTAwNjQ0Ci0tLSBhL2F1dG8vc291cmNlcworKysgYi9hdXRvL3NvdXJjZXMKQEAgLTIxLDE0ICsyMSwxMyBAQAogICAgICAgICAgICBzcmMvY29yZS9uZ3hfZmlsZS5oIFwKICAgICAgICAgICAgc3JjL2NvcmUvbmd4X2NyYy5oIFwKICAgICAgICAgICAgc3JjL2NvcmUvbmd4X3JidHJlZS5oIFwKKyAgICAgICAgICAgc3JjL2NvcmUvbmd4X3JhZGl4X3RyZWUuaCBcCiAgICAgICAgICAgIHNyYy9jb3JlL25neF90aW1lcy5oIFwKICAgICAgICAgICAgc3JjL2NvcmUvbmd4X2Nvbm5lY3Rpb24uaCBcCiAgICAgICAgICAgIHNyYy9jb3JlL25neF9jeWNsZS5oIFwKICAgICAgICAgICAgc3JjL2NvcmUvbmd4X2NvbmZfZmlsZS5oIFwKICAgICAgICAgICAgc3JjL2NvcmUvbmd4X2dhcmJhZ2VfY29sbGVjdG9yLmgiCiAKLSMgICAgICAgICAgIHNyYy9jb3JlL25neF9yYWRpeF90cmVlLmggXAotIyAgICAgICAgICAgc3JjL2NvcmUvbmd4X3JhZGl4X3RyZWUuYyBcCiAKIENPUkVfU1JDUz0ic3JjL2NvcmUvbmdpbnguYyBcCiAgICAgICAgICAgIHNyYy9jb3JlL25neF9sb2cuYyBcCkBAIC00Miw2ICs0MSw3IEBACiAgICAgICAgICAgIHNyYy9jb3JlL25neF9pbmV0LmMgXAogICAgICAgICAgICBzcmMvY29yZS9uZ3hfZmlsZS5jIFwKICAgICAgICAgICAgc3JjL2NvcmUvbmd4X3JidHJlZS5jIFwKKyAgICAgICAgICAgc3JjL2NvcmUvbmd4X3JhZGl4X3RyZWUuYyBcCiAgICAgICAgICAgIHNyYy9jb3JlL25neF90aW1lcy5jIFwKICAgICAgICAgICAgc3JjL2NvcmUvbmd4X2Nvbm5lY3Rpb24uYyBcCiAgICAgICAgICAgIHNyYy9jb3JlL25neF9jeWNsZS5jIFwKQEAgLTI5Niw2ICsyOTYsMTAgQEAKIEhUVFBfU1RBVFVTX1NSQ1M9c3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9zdGF0dXNfaGFuZGxlci5jCiAKIAorSFRUUF9HRU9fTU9EVUxFPW5neF9odHRwX2dlb19tb2R1bGUKK0hUVFBfR0VPX1NSQ1M9c3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9nZW9fbW9kdWxlLmMKKworCiBIVFRQX1JFV1JJVEVfTU9EVUxFPW5neF9odHRwX3Jld3JpdGVfbW9kdWxlCiBIVFRQX1JFV1JJVEVfU1JDUz1zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3Jld3JpdGVfaGFuZGxlci5jCiAKZGlmZiAtLWdpdCBhL2F1dG8vdW5peCBiL2F1dG8vdW5peAppbmRleCAzN2JiNWQyLi40MDZmMmEyIDEwMDc1NQotLS0gYS9hdXRvL3VuaXgKKysrIGIvYXV0by91bml4CkBAIC05NCw4ICs5NCw4IEBACiBuZ3hfZmVhdHVyZV9ydW49eWVzCiBuZ3hfZmVhdHVyZV9pbmNzPSIjaW5jbHVkZSA8c3RyaW5nLmg+Igogbmd4X2ZlYXR1cmVfbGlicz0KLW5neF9mZWF0dXJlX3Rlc3Q9ImNoYXIgYnVmWzMyXTsgaW50IG47IG4gPSBzdHJlcnJvcl9yKDEsIGJ1ZiwgMzIpOwotICAgICAgICAgICAgICAgICAgaWYgKG4gPiAzMikgcmV0dXJuIDE7Igorbmd4X2ZlYXR1cmVfdGVzdD0iY2hhciBidWZbMTAyNF07IGxvbmcgbjsgbiA9IHN0cmVycm9yX3IoMSwgYnVmLCAxMDI0KTsKKyAgICAgICAgICAgICAgICAgIGlmIChuIDwgMCB8fCBuID4gMTAyNCkgcmV0dXJuIDE7IgogLiBhdXRvL2ZlYXR1cmUKIAogCkBAIC0xMDYsOCArMTA2LDggQEAKIG5neF9mZWF0dXJlX3J1bj15ZXMKIG5neF9mZWF0dXJlX2luY3M9IiNpbmNsdWRlIDxzdHJpbmcuaD4iCiBuZ3hfZmVhdHVyZV9saWJzPQotbmd4X2ZlYXR1cmVfdGVzdD0iY2hhciBidWZbMzJdOyBpbnQgbjsgbiA9IHN0cmVycm9yX3IoMSwgYnVmLCAzMik7Ci0gICAgICAgICAgICAgICAgICBpZiAobiA8IDMyKSByZXR1cm4gMTsiCituZ3hfZmVhdHVyZV90ZXN0PSJjaGFyIGJ1ZlsxMDI0XTsgbG9uZyBuOyBuID0gc3RyZXJyb3JfcigxLCBidWYsIDEwMjQpOworICAgICAgICAgICAgICAgICAgaWYgKG4gPj0gMCAmJiBuIDwgMTAyNCkgcmV0dXJuIDE7IgogLiBhdXRvL2ZlYXR1cmUKIAogCmRpZmYgLS1naXQgYS9kb2NzL3htbC9uZ2lueC9jaGFuZ2VzLnhtbCBiL2RvY3MveG1sL25naW54L2NoYW5nZXMueG1sCmluZGV4IGViNDY2ZDguLjczMjNkNDggMTAwNjQ0Ci0tLSBhL2RvY3MveG1sL25naW54L2NoYW5nZXMueG1sCisrKyBiL2RvY3MveG1sL25naW54L2NoYW5nZXMueG1sCkBAIC05LDYgKzksMTAzIEBACiA8dGl0bGUgbGFuZz0iZW4iPm5naW54IGNoYW5nZWxvZzwvdGl0bGU+CiAKIAorPGNoYW5nZXMgdmVyPSIwLjEuMTciIGRhdGU9IjAzLjAyLjIwMDUiPgorCis8Y2hhbmdlIHR5cGU9ImZlYXR1cmUiPgorPHBhcmEgbGFuZz0icnUiPgorzc/E1czYIG5neF9odHRwX3Jld3JpdGVfbW9kdWxlINDPzM7P09TYwCDQxdLF0MnTwc4uCiv0xdDF0tggzc/Wzs8gxMXMwdTYINLFxMnSxcvU2Swg18/a19LB3cHU2CDLz8TZIM/bycLPyworySDQ0s/XxdLR1Ngg0MXSxc3Fzs7ZxSDJINLFxsXSxdLZLgor/NTJIMTJ0sXL1MnX2SDNz9bOzyDJ09DPzNjaz9fB1Ngg187V1NLJIGxvY2F0aW9uLgor5MnSxcvUydfBIHJlZGlyZWN0INXQ0sHaxM7FzsEuCis8L3BhcmE+Cis8cGFyYSBsYW5nPSJlbiI+Cit0aGUgbmd4X2h0dHBfcmV3cml0ZV9tb2R1bGUgd2FzIHJld3JpdHRlbiBmcm9tIHRoZSBzY3JhdGNoLgorTm93IGl0IGlzIHBvc3NpYmxlIHRvIHJlZGlyZWN0LCB0byByZXR1cm4gdGhlIGVycm9yIGNvZGVzLAordG8gY2hlY2sgdGhlIHZhcmlhYmxlcyBhbmQgcmVmZXJyZXJzLiBUaGUgZGlyZWN0aXZlcyBjYW4gYmUgdXNlZAoraW5zaWRlIGxvY2F0aW9ucy4KK1RoZSByZWRpcmVjdCBkaXJlY3RpdmUgd2FzIGNhbmNlbGVkLgorPC9wYXJhPgorPC9jaGFuZ2U+CisKKzxjaGFuZ2UgdHlwZT0iZmVhdHVyZSI+Cis8cGFyYSBsYW5nPSJydSI+CivNz8TVzNggbmd4X2h0dHBfZ2VvX21vZHVsZS4KKzwvcGFyYT4KKzxwYXJhIGxhbmc9ImVuIj4KK3RoZSBuZ3hfaHR0cF9nZW9fbW9kdWxlLgorPC9wYXJhPgorPC9jaGFuZ2U+CisKKzxjaGFuZ2UgdHlwZT0iZmVhdHVyZSI+Cis8cGFyYSBsYW5nPSJydSI+CivEydLFy9TJ19kgcHJveHlfc2V0X3hfdmFyIMkgZmFzdGNnaV9zZXRfdmFyLgorPC9wYXJhPgorPHBhcmEgbGFuZz0iZW4iPgordGhlIHByb3h5X3NldF94X3ZhciBhbmQgZmFzdGNnaV9zZXRfdmFyIGRpcmVjdGl2ZXMuCis8L3BhcmE+Cis8L2NoYW5nZT4KKworPGNoYW5nZSB0eXBlPSJidWdmaXgiPgorPHBhcmEgbGFuZz0icnUiPgory8/OxsnH1dLBw8nRIGxvY2F0aW9uINMgzc/EycbJy8HUz9LPzSAiPSIgzc/HzMEgydPQz8zY2s/XwdTY09EKK9cgxNLVx8/NIGxvY2F0aW9uLgorPC9wYXJhPgorPHBhcmEgbGFuZz0iZW4iPgordGhlIGxvY2F0aW9uIGNvbmZpZ3VyYXRpb24gd2l0aCAiPSIgbW9kaWZpZXIgbWF5IGJlIHVzZWQgaW4gYW5vdGhlcgorbG9jYXRpb24uCis8L3BhcmE+Cis8L2NoYW5nZT4KKworPGNoYW5nZSB0eXBlPSJidWdmaXgiPgorPHBhcmEgbGFuZz0icnUiPgor0NLB18nM2M7ZyiDUydAgz9TXxdTBINfZ09TB18zRzNPRINTPzNjLzyDEzNEg2sHQ0s/Tz9csINUgy8/Uz9LZyCDXINLB09vJ0sXOyckKK8LZzMkg1M/M2MvPIM3BzMXO2MvJxSDC1cvX2S4KKzwvcGFyYT4KKzxwYXJhIGxhbmc9ImVuIj4KK3RoZSBjb3JyZWN0IGNvbnRlbnQgdHlwZSB3YXMgc2V0IG9ubHkgZm9yIHJlcXVlc3RzIHRoYXQgdXNlIHNtYWxsIGNhcHMgbGV0dGVycworaW4gZXh0ZW5zaW9uLgorPC9wYXJhPgorPC9jaGFuZ2U+CisKKzxjaGFuZ2UgdHlwZT0iYnVnZml4Ij4KKzxwYXJhIGxhbmc9InJ1Ij4KK8XTzMkgxMzRIGxvY2F0aW9uINXT1MHOz9fMxc4gcHJveHlfcGFzcyDJzMkgZmFzdGNnaV9wYXNzLCDJIMTP09TV0AoryyDOxc3VINrB0NLF3cHM09EsIMEgz9vJwsvBINDF0sXOwdDSwdfM0czB09ggzsEg09TB1MnexdPL1cAg09TSwc7Jw9UsCivUzyDQ0s/J08jPxMnMIHNlZ21lbnRhdGlvbiBmYXVsdC4KKzwvcGFyYT4KKzxwYXJhIGxhbmc9ImVuIj4KK2lmIHRoZSBwcm94eV9wYXNzIG9yIGZhc3RjZ2lfcGFzcyBkaXJlY3RpdmVzIHdlcmUgc2V0IGluIHRoZSBsb2NhdGlvbiwKK2FuZCBhY2Nlc3Mgd2FzIGRlbmllZCwgYW5kIHRoZSBlcnJvciB3YXMgcmVkaXJlY3RlZCB0byBhIHN0YXRpYyBwYWdlLAordGhlbiB0aGUgc2VnbWVudGF0aW9uIGZhdWx0IG9jY3VycmVkLgorPC9wYXJhPgorPC9jaGFuZ2U+CisKKzxjaGFuZ2UgdHlwZT0iYnVnZml4Ij4KKzxwYXJhIGxhbmc9InJ1Ij4KK8XTzMkg1yDQ0s/L08nSz9fBzs7PzSDP1NfF1MUg1yDawcfPzM/Xy8UgIkxvY2F0aW9uIiDQxdLFxMHXwczT0Qorz9TOz9PJ1MXM2M7ZyiBVUkwsINTPIMsgzsXN1SDEz8LB18zRzM/T2CDJzdEgyM/T1MEgySDTzNzbOworz9vJwsvBINDP0dfJzMHT2CDXIDAuMS4xNC4KKzwvcGFyYT4KKzxwYXJhIGxhbmc9ImVuIj4KK2lmIGluIGEgcHJveGllZCAiTG9jYXRpb24iIGhlYWRlciB3YXMgYSByZWxhdGl2ZSBVUkwsCit0aGVuIGEgaG9zdCBuYW1lIGFuZCBhIHNsYXNoIHdlcmUgYWRkZWQgdG8gdGhlbTsKK2J1ZyBhcHBlYXJlZCBpbiAwLjEuMTQuCis8L3BhcmE+Cis8L2NoYW5nZT4KKworPGNoYW5nZSB0eXBlPSJidWdmaXgiPgorPHBhcmEgbGFuZz0icnUiPgorzsEgTGludXgg1yDMz8cgzsUg2sHQydPZ18HM09Eg1MXL09Qg08nT1MXNzs/KIM/bycLLyS4KKzwvcGFyYT4KKzxwYXJhIGxhbmc9ImVuIj4KK3RoZSBzeXN0ZW0gZXJyb3IgbWVzc2FnZSB3YXMgbm90IGxvZ2dlZCBvbiBMaW51eC4KKzwvcGFyYT4KKzwvY2hhbmdlPgorCis8L2NoYW5nZXM+CisKKwogPGNoYW5nZXMgdmVyPSIwLjEuMTYiIGRhdGU9IjI1LjAxLjIwMDUiPgogCiA8Y2hhbmdlIHR5cGU9ImJ1Z2ZpeCI+CmRpZmYgLS1naXQgYS9zcmMvY29yZS9uZ2lueC5oIGIvc3JjL2NvcmUvbmdpbnguaAppbmRleCAwYjlkOTkwLi5jNmFmYzQ1IDEwMDY0NAotLS0gYS9zcmMvY29yZS9uZ2lueC5oCisrKyBiL3NyYy9jb3JlL25naW54LmgKQEAgLTgsNyArOCw3IEBACiAjZGVmaW5lIF9OR0lOWF9IX0lOQ0xVREVEXwogCiAKLSNkZWZpbmUgTkdJTlhfVkVSICAgICAgICAgICJuZ2lueC8wLjEuMTYiCisjZGVmaW5lIE5HSU5YX1ZFUiAgICAgICAgICAibmdpbngvMC4xLjE3IgogCiAjZGVmaW5lIE5HSU5YX1ZBUiAgICAgICAgICAiTkdJTlgiCiAjZGVmaW5lIE5HWF9ORVdQSURfRVhUICAgICAiLm5ld2JpbiIKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL25neF9hcnJheS5jIGIvc3JjL2NvcmUvbmd4X2FycmF5LmMKaW5kZXggNmVhZTc2Zi4uODJkNWQxZCAxMDA2NDQKLS0tIGEvc3JjL2NvcmUvbmd4X2FycmF5LmMKKysrIGIvc3JjL2NvcmUvbmd4X2FycmF5LmMKQEAgLTgsNjcgKzgsMTMwIEBACiAjaW5jbHVkZSA8bmd4X2NvcmUuaD4KIAogCi1uZ3hfYXJyYXlfdCAqbmd4X2NyZWF0ZV9hcnJheShuZ3hfcG9vbF90ICpwLCBuZ3hfdWludF90IG4sIHNpemVfdCBzaXplKQorbmd4X2FycmF5X3QgKm5neF9hcnJheV9jcmVhdGUobmd4X3Bvb2xfdCAqcCwgbmd4X3VpbnRfdCBuLCBzaXplX3Qgc2l6ZSkKIHsKICAgICBuZ3hfYXJyYXlfdCAqYTsKIAotICAgIG5neF90ZXN0X251bGwoYSwgbmd4X3BhbGxvYyhwLCBzaXplb2Yobmd4X2FycmF5X3QpKSwgTlVMTCk7CisgICAgaWYgKCEoYSA9IG5neF9wYWxsb2MocCwgc2l6ZW9mKG5neF9hcnJheV90KSkpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotICAgIG5neF90ZXN0X251bGwoYS0+ZWx0cywgbmd4X3BhbGxvYyhwLCBuICogc2l6ZSksIE5VTEwpOworICAgIGlmICghKGEtPmVsdHMgPSBuZ3hfcGFsbG9jKHAsIG4gKiBzaXplKSkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0gICAgYS0+cG9vbCA9IHA7CiAgICAgYS0+bmVsdHMgPSAwOwotICAgIGEtPm5hbGxvYyA9IG47CiAgICAgYS0+c2l6ZSA9IHNpemU7CisgICAgYS0+bmFsbG9jID0gbjsKKyAgICBhLT5wb29sID0gcDsKIAogICAgIHJldHVybiBhOwogfQogCiAKLXZvaWQgbmd4X2Rlc3Ryb3lfYXJyYXkobmd4X2FycmF5X3QgKmEpCit2b2lkIG5neF9hcnJheV9kZXN0cm95KG5neF9hcnJheV90ICphKQogewogICAgIG5neF9wb29sX3QgICpwOwogCiAgICAgcCA9IGEtPnBvb2w7CiAKLSAgICBpZiAoKGNoYXIgKikgYS0+ZWx0cyArIGEtPnNpemUgKiBhLT5uYWxsb2MgPT0gcC0+bGFzdCkgeworICAgIGlmICgodV9jaGFyICopIGEtPmVsdHMgKyBhLT5zaXplICogYS0+bmFsbG9jID09IHAtPmxhc3QpIHsKICAgICAgICAgcC0+bGFzdCAtPSBhLT5zaXplICogYS0+bmFsbG9jOwogICAgIH0KIAotICAgIGlmICgoY2hhciAqKSBhICsgc2l6ZW9mKG5neF9hcnJheV90KSA9PSBwLT5sYXN0KSB7Ci0gICAgICAgIHAtPmxhc3QgPSAoY2hhciAqKSBhOworICAgIGlmICgodV9jaGFyICopIGEgKyBzaXplb2Yobmd4X2FycmF5X3QpID09IHAtPmxhc3QpIHsKKyAgICAgICAgcC0+bGFzdCA9ICh1X2NoYXIgKikgYTsKICAgICB9CiB9CiAKIAotdm9pZCAqbmd4X3B1c2hfYXJyYXkobmd4X2FycmF5X3QgKmEpCit2b2lkICpuZ3hfYXJyYXlfcHVzaChuZ3hfYXJyYXlfdCAqYSkKIHsKICAgICB2b2lkICAgICAgICAqZWx0LCAqbmV3OworICAgIHNpemVfdCAgICAgICBzaXplOwogICAgIG5neF9wb29sX3QgICpwOwogCi0gICAgLyogYXJyYXkgaXMgZnVsbCAqLwogICAgIGlmIChhLT5uZWx0cyA9PSBhLT5uYWxsb2MpIHsKKworICAgICAgICAvKiB0aGUgYXJyYXkgaXMgZnVsbCAqLworCisgICAgICAgIHNpemUgPSBhLT5zaXplICogYS0+bmFsbG9jOworCiAgICAgICAgIHAgPSBhLT5wb29sOwogCi0gICAgICAgIC8qIGFycmF5IGFsbG9jYXRpb24gaXMgdGhlIGxhc3QgaW4gdGhlIHBvb2wgKi8KLSAgICAgICAgaWYgKChjaGFyICopIGEtPmVsdHMgKyBhLT5zaXplICogYS0+bmVsdHMgPT0gcC0+bGFzdAotICAgICAgICAgICAgJiYgKHVuc2lnbmVkKSAocC0+ZW5kIC0gcC0+bGFzdCkgPj0gYS0+c2l6ZSkKKyAgICAgICAgaWYgKCh1X2NoYXIgKikgYS0+ZWx0cyArIHNpemUgPT0gcC0+bGFzdCAmJiBwLT5sYXN0ICsgYS0+c2l6ZSA8PSBwLT5lbmQpCiAgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiB0aGUgYXJyYXkgYWxsb2NhdGlvbiBpcyB0aGUgbGFzdCBpbiB0aGUgcG9vbAorICAgICAgICAgICAgICogYW5kIHRoZXJlIGlzIHNwYWNlIGZvciBuZXcgYWxsb2NhdGlvbgorICAgICAgICAgICAgICovCisKICAgICAgICAgICAgIHAtPmxhc3QgKz0gYS0+c2l6ZTsKICAgICAgICAgICAgIGEtPm5hbGxvYysrOwogCi0gICAgICAgIC8qIGFsbG9jYXRlIG5ldyBhcnJheSAqLwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbmd4X3Rlc3RfbnVsbChuZXcsIG5neF9wYWxsb2MocCwgMiAqIGEtPm5hbGxvYyAqIGEtPnNpemUpLCBOVUxMKTsKKyAgICAgICAgICAgIC8qIGFsbG9jYXRlIGEgbmV3IGFycmF5ICovCiAKLSAgICAgICAgICAgIG5neF9tZW1jcHkobmV3LCBhLT5lbHRzLCBhLT5uYWxsb2MgKiBhLT5zaXplKTsKKyAgICAgICAgICAgIGlmICghKG5ldyA9IG5neF9wYWxsb2MocCwgMiAqIHNpemUpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBuZ3hfbWVtY3B5KG5ldywgYS0+ZWx0cywgc2l6ZSk7CiAgICAgICAgICAgICBhLT5lbHRzID0gbmV3OwogICAgICAgICAgICAgYS0+bmFsbG9jICo9IDI7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBlbHQgPSAoY2hhciAqKSBhLT5lbHRzICsgYS0+c2l6ZSAqIGEtPm5lbHRzOworICAgIGVsdCA9ICh1X2NoYXIgKikgYS0+ZWx0cyArIGEtPnNpemUgKiBhLT5uZWx0czsKICAgICBhLT5uZWx0cysrOwogCiAgICAgcmV0dXJuIGVsdDsKIH0KKworCit2b2lkICpuZ3hfYXJyYXlfcHVzaF9uKG5neF9hcnJheV90ICphLCBuZ3hfdWludF90IG4pCit7CisgICAgdm9pZCAgICAgICAgKmVsdCwgKm5ldzsKKyAgICBzaXplX3QgICAgICAgc2l6ZTsKKyAgICBuZ3hfdWludF90ICAgbmFsbG9jOworICAgIG5neF9wb29sX3QgICpwOworCisgICAgc2l6ZSA9IG4gKiBhLT5zaXplOworCisgICAgaWYgKGEtPm5lbHRzICsgbiA+IGEtPm5hbGxvYykgeworCisgICAgICAgIC8qIHRoZSBhcnJheSBpcyBmdWxsICovCisKKyAgICAgICAgcCA9IGEtPnBvb2w7CisKKyAgICAgICAgaWYgKCh1X2NoYXIgKikgYS0+ZWx0cyArIGEtPnNpemUgKiBhLT5uYWxsb2MgPT0gcC0+bGFzdAorICAgICAgICAgICAgJiYgcC0+bGFzdCArIHNpemUgPD0gcC0+ZW5kKQorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogdGhlIGFycmF5IGFsbG9jYXRpb24gaXMgdGhlIGxhc3QgaW4gdGhlIHBvb2wKKyAgICAgICAgICAgICAqIGFuZCB0aGVyZSBpcyBzcGFjZSBmb3IgbmV3IGFsbG9jYXRpb24KKyAgICAgICAgICAgICAqLworCisgICAgICAgICAgICBwLT5sYXN0ICs9IHNpemU7CisgICAgICAgICAgICBhLT5uYWxsb2MgKz0gbjsKKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogYWxsb2NhdGUgYSBuZXcgYXJyYXkgKi8KKworICAgICAgICAgICAgbmFsbG9jID0gMiAqICgobiA+PSBhLT5uYWxsb2MpID8gbiA6IGEtPm5hbGxvYyk7CisKKyAgICAgICAgICAgIGlmICghKG5ldyA9IG5neF9wYWxsb2MocCwgbmFsbG9jICogYS0+c2l6ZSkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG5neF9tZW1jcHkobmV3LCBhLT5lbHRzLCBhLT5uZWx0cyAqIGEtPnNpemUpOworICAgICAgICAgICAgYS0+ZWx0cyA9IG5ldzsKKyAgICAgICAgICAgIGEtPm5hbGxvYyA9IG5hbGxvYzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGVsdCA9ICh1X2NoYXIgKikgYS0+ZWx0cyArIGEtPnNpemUgKiBhLT5uZWx0czsKKyAgICBhLT5uZWx0cyArPSBuOworCisgICAgcmV0dXJuIGVsdDsKK30KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL25neF9hcnJheS5oIGIvc3JjL2NvcmUvbmd4X2FycmF5LmgKaW5kZXggOTMxYzdmYi4uZDkwY2Y3NiAxMDA2NDQKLS0tIGEvc3JjL2NvcmUvbmd4X2FycmF5LmgKKysrIGIvc3JjL2NvcmUvbmd4X2FycmF5LmgKQEAgLTIxLDkgKzIxLDEwIEBACiB9OwogCiAKLW5neF9hcnJheV90ICpuZ3hfY3JlYXRlX2FycmF5KG5neF9wb29sX3QgKnAsIG5neF91aW50X3Qgbiwgc2l6ZV90IHNpemUpOwotdm9pZCBuZ3hfZGVzdHJveV9hcnJheShuZ3hfYXJyYXlfdCAqYSk7Ci12b2lkICpuZ3hfcHVzaF9hcnJheShuZ3hfYXJyYXlfdCAqYSk7CituZ3hfYXJyYXlfdCAqbmd4X2FycmF5X2NyZWF0ZShuZ3hfcG9vbF90ICpwLCBuZ3hfdWludF90IG4sIHNpemVfdCBzaXplKTsKK3ZvaWQgbmd4X2FycmF5X2Rlc3Ryb3kobmd4X2FycmF5X3QgKmEpOwordm9pZCAqbmd4X2FycmF5X3B1c2gobmd4X2FycmF5X3QgKmEpOwordm9pZCAqbmd4X2FycmF5X3B1c2hfbihuZ3hfYXJyYXlfdCAqYSwgbmd4X3VpbnRfdCBuKTsKIAogCiBzdGF0aWMgbmd4X2lubGluZSBuZ3hfaW50X3Qgbmd4X2FycmF5X2luaXQobmd4X2FycmF5X3QgKmFycmF5LCBuZ3hfcG9vbF90ICpwb29sLApAQCAtNDIsMTMgKzQzLDE0IEBACiB9CiAKIAotCisvKiBTVFVCICovCiAjZGVmaW5lIG5neF9pbml0X2FycmF5KGEsIHAsIG4sIHMsIHJjKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBuZ3hfdGVzdF9udWxsKGEuZWx0cywgbmd4X3BhbGxvYyhwLCBuICogcyksIHJjKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIGEubmVsdHMgPSAwOyBhLnNpemUgPSBzOyBhLm5hbGxvYyA9IG47IGEucG9vbCA9IHA7CiAKLSNkZWZpbmUgbmd4X2FycmF5X2NyZWF0ZSAgbmd4X2NyZWF0ZV9hcnJheQotI2RlZmluZSBuZ3hfYXJyYXlfcHVzaCAgICBuZ3hfcHVzaF9hcnJheQorI2RlZmluZSBuZ3hfY3JlYXRlX2FycmF5ICBuZ3hfYXJyYXlfY3JlYXRlCisjZGVmaW5lIG5neF9wdXNoX2FycmF5ICAgIG5neF9hcnJheV9wdXNoCisvKiovCiAKIAogI2VuZGlmIC8qIF9OR1hfQVJSQVlfSF9JTkNMVURFRF8gKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL25neF9jb25mX2ZpbGUuYyBiL3NyYy9jb3JlL25neF9jb25mX2ZpbGUuYwppbmRleCAxOWE1NjdmLi5lOWNjMjRkIDEwMDY0NAotLS0gYS9zcmMvY29yZS9uZ3hfY29uZl9maWxlLmMKKysrIGIvc3JjL2NvcmUvbmd4X2NvbmZfZmlsZS5jCkBAIC04Nyw3ICs4Nyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9mZF9pbmZvX24gIiBcIiVzXCIgZmFpbGVkIiwgZmlsZW5hbWUtPmRhdGEpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKCEoY2YtPmNvbmZfZmlsZS0+YnVmZmVyID0gbmd4X2NyZWF0ZV90ZW1wX2J1ZihjZi0+cG9vbCwgMTAyNCkpKSB7CisgICAgICAgIGNmLT5jb25mX2ZpbGUtPmJ1ZmZlciA9IG5neF9jcmVhdGVfdGVtcF9idWYoY2YtPnBvb2wsIG5neF9wYWdlc2l6ZSk7CisgICAgICAgIGlmIChjZi0+Y29uZl9maWxlLT5idWZmZXIgPT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL25neF9jb25maWcuaCBiL3NyYy9jb3JlL25neF9jb25maWcuaAppbmRleCBmY2VmMzczLi5kYzc5MWQ0IDEwMDY0NAotLS0gYS9zcmMvY29yZS9uZ3hfY29uZmlnLmgKKysrIGIvc3JjL2NvcmUvbmd4X2NvbmZpZy5oCkBAIC0xMDUsNyArMTA1LDcgQEAKIAogI2VuZGlmCiAKLSNkZWZpbmUgbmd4X2FsaWduKHApICAgIChjaGFyICopICgoTkdYX0FMSUdOX0NBU1QgcCArIE5HWF9BTElHTikgJiB+TkdYX0FMSUdOKQorI2RlZmluZSBuZ3hfYWxpZ24ocCkgICAgKHVfY2hhciAqKSAoKE5HWF9BTElHTl9DQVNUIHAgKyBOR1hfQUxJR04pICYgfk5HWF9BTElHTikKIAogCiAvKiBUT0RPOiBhdXRvX2NvbmY6IG5neF9pbmxpbmUgICBpbmxpbmUgX19pbmxpbmUgX19pbmxpbmVfXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbmd4X2NvcmUuaCBiL3NyYy9jb3JlL25neF9jb3JlLmgKaW5kZXggZGI0M2E0NC4uMTMwNTNmMiAxMDA2NDQKLS0tIGEvc3JjL2NvcmUvbmd4X2NvcmUuaAorKysgYi9zcmMvY29yZS9uZ3hfY29yZS5oCkBAIC01OSw2ICs1OSw3IEBACiAjaW5jbHVkZSA8bmd4X3JlZ2V4Lmg+CiAjZW5kaWYKICNpbmNsdWRlIDxuZ3hfcmJ0cmVlLmg+CisjaW5jbHVkZSA8bmd4X3JhZGl4X3RyZWUuaD4KICNpbmNsdWRlIDxuZ3hfdGltZXMuaD4KICNpbmNsdWRlIDxuZ3hfaW5ldC5oPgogI2lmIChOR1hfSEFWRV9VTklYX0RPTUFJTikKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL25neF9wYWxsb2MuYyBiL3NyYy9jb3JlL25neF9wYWxsb2MuYwppbmRleCBjMWI1NWU1Li5mYzZmMzZlIDEwMDY0NAotLS0gYS9zcmMvY29yZS9uZ3hfcGFsbG9jLmMKKysrIGIvc3JjL2NvcmUvbmd4X3BhbGxvYy5jCkBAIC0xNiw4ICsxNiw4IEBACiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgcC0+bGFzdCA9IChjaGFyICopIHAgKyBzaXplb2Yobmd4X3Bvb2xfdCk7Ci0gICAgcC0+ZW5kID0gKGNoYXIgKikgcCArIHNpemU7CisgICAgcC0+bGFzdCA9ICh1X2NoYXIgKikgcCArIHNpemVvZihuZ3hfcG9vbF90KTsKKyAgICBwLT5lbmQgPSAodV9jaGFyICopIHAgKyBzaXplOwogICAgIHAtPm5leHQgPSBOVUxMOwogICAgIHAtPmxhcmdlID0gTlVMTDsKICAgICBwLT5sb2cgPSBsb2c7CkBAIC03MCwxMiArNzAsMTIgQEAKIAogdm9pZCAqbmd4X3BhbGxvYyhuZ3hfcG9vbF90ICpwb29sLCBzaXplX3Qgc2l6ZSkKIHsKLSAgICBjaGFyICAgICAgICAgICAgICAqbTsKKyAgICB1X2NoYXIgICAgICAgICAgICAqbTsKICAgICBuZ3hfcG9vbF90ICAgICAgICAqcCwgKm47CiAgICAgbmd4X3Bvb2xfbGFyZ2VfdCAgKmxhcmdlLCAqbGFzdDsKIAogICAgIGlmIChzaXplIDw9IChzaXplX3QpIE5HWF9NQVhfQUxMT0NfRlJPTV9QT09MCi0gICAgICAgICYmIHNpemUgPD0gKHNpemVfdCkgKHBvb2wtPmVuZCAtIChjaGFyICopIHBvb2wpCisgICAgICAgICYmIHNpemUgPD0gKHNpemVfdCkgKHBvb2wtPmVuZCAtICh1X2NoYXIgKikgcG9vbCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIChzaXplX3QpIG5neF9hbGlnbihzaXplb2Yobmd4X3Bvb2xfdCkpKQogICAgIHsKICAgICAgICAgZm9yIChwID0gcG9vbCwgbiA9IHBvb2wtPm5leHQ7IC8qIHZvaWQgKi87IHAgPSBuLCBuID0gbi0+bmV4dCkgewpAQCAtOTQsNyArOTQsNyBAQAogCiAgICAgICAgIC8qIGFsbG9jYXRlIGEgbmV3IHBvb2wgYmxvY2sgKi8KIAotICAgICAgICBpZiAoIShuID0gbmd4X2NyZWF0ZV9wb29sKChzaXplX3QpIChwLT5lbmQgLSAoY2hhciAqKSBwKSwgcC0+bG9nKSkpIHsKKyAgICAgICAgaWYgKCEobiA9IG5neF9jcmVhdGVfcG9vbCgoc2l6ZV90KSAocC0+ZW5kIC0gKHVfY2hhciAqKSBwKSwgcC0+bG9nKSkpIHsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL25neF9wYWxsb2MuaCBiL3NyYy9jb3JlL25neF9wYWxsb2MuaAppbmRleCA1MzQ0OGY0Li43MWJlNzQyIDEwMDY0NAotLS0gYS9zcmMvY29yZS9uZ3hfcGFsbG9jLmgKKysrIGIvc3JjL2NvcmUvbmd4X3BhbGxvYy5oCkBAIC0zMyw4ICszMyw4IEBACiAKIAogc3RydWN0IG5neF9wb29sX3MgewotICAgIGNoYXIgICAgICAgICAgICAgICpsYXN0OwotICAgIGNoYXIgICAgICAgICAgICAgICplbmQ7CisgICAgdV9jaGFyICAgICAgICAgICAgKmxhc3Q7CisgICAgdV9jaGFyICAgICAgICAgICAgKmVuZDsKICAgICBuZ3hfcG9vbF90ICAgICAgICAqbmV4dDsKICAgICBuZ3hfcG9vbF9sYXJnZV90ICAqbGFyZ2U7CiAgICAgbmd4X2xvZ190ICAgICAgICAgKmxvZzsKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL25neF9yYWRpeF90cmVlLmMgYi9zcmMvY29yZS9uZ3hfcmFkaXhfdHJlZS5jCmluZGV4IGMxZDM0OWUuLjk0OTNiYWIgMTAwNjQ0Ci0tLSBhL3NyYy9jb3JlL25neF9yYWRpeF90cmVlLmMKKysrIGIvc3JjL2NvcmUvbmd4X3JhZGl4X3RyZWUuYwpAQCAtOCw3ICs4LDcgQEAKICNpbmNsdWRlIDxuZ3hfY29yZS5oPgogCiAKLXN0YXRpYyB2b2lkICpuZ3hfcmFkaXhfYWxsb2Mobmd4X3JhZGl4X3RyZWVfdCAqdHJlZSwgc2l6ZV90IHNpemUpOworc3RhdGljIHZvaWQgKm5neF9yYWRpeF9hbGxvYyhuZ3hfcmFkaXhfdHJlZV90ICp0cmVlKTsKIAogCiBuZ3hfcmFkaXhfdHJlZV90ICpuZ3hfcmFkaXhfdHJlZV9jcmVhdGUobmd4X3Bvb2xfdCAqcG9vbCkKQEAgLTI0LDE0ICsyNCwxNCBAQAogICAgIHRyZWUtPnN0YXJ0ID0gTlVMTDsKICAgICB0cmVlLT5zaXplID0gMDsKIAotICAgIGlmICghKHRyZWUtPnJvb3QgPSBuZ3hfcmFkaXhfYWxsb2ModHJlZSwgc2l6ZW9mKG5neF9yYWRpeF9ub2RlX3QpKSkpIHsKKyAgICBpZiAoISh0cmVlLT5yb290ID0gbmd4X3JhZGl4X2FsbG9jKHRyZWUpKSkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICB0cmVlLT5yb290LT52YWx1ZSA9ICh1aW50cHRyX3QpIDA7CiAgICAgdHJlZS0+cm9vdC0+cmlnaHQgPSBOVUxMOwogICAgIHRyZWUtPnJvb3QtPmxlZnQgPSBOVUxMOwogICAgIHRyZWUtPnJvb3QtPnBhcmVudCA9IE5VTEw7CisgICAgdHJlZS0+cm9vdC0+dmFsdWUgPSBOR1hfUkFESVhfTk9fVkFMVUU7CiAKICAgICByZXR1cm4gdHJlZTsKIH0KQEAgLTQ0LDggKzQ0LDkgQEAKICAgICBuZ3hfcmFkaXhfbm9kZV90ICAqbm9kZSwgKm5leHQ7CiAKICAgICBiaXQgPSAweDgwMDAwMDAwOworCiAgICAgbm9kZSA9IHRyZWUtPnJvb3Q7Ci0gICAgbmV4dCA9IE5VTEw7CisgICAgbmV4dCA9IHRyZWUtPnJvb3Q7CiAKICAgICB3aGlsZSAoYml0ICYgbWFzaykgewogICAgICAgICBpZiAoa2V5ICYgYml0KSB7CkBAIC01NSwxNyArNTYsMTYgQEAKICAgICAgICAgICAgIG5leHQgPSBub2RlLT5sZWZ0OwogICAgICAgICB9CiAKLSAgICAgICAgYml0ID4+PSAxOwotCiAgICAgICAgIGlmIChuZXh0ID09IE5VTEwpIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKKyAgICAgICAgYml0ID4+PSAxOwogICAgICAgICBub2RlID0gbmV4dDsKICAgICB9CiAKICAgICBpZiAobmV4dCkgewotICAgICAgICBpZiAobm9kZS0+dmFsdWUpIHsKKyAgICAgICAgaWYgKG5vZGUtPnZhbHVlICE9IE5HWF9SQURJWF9OT19WQUxVRSkgewogICAgICAgICAgICAgcmV0dXJuIE5HWF9CVVNZOwogICAgICAgICB9CiAKQEAgLTc0LDE0ICs3NCwxNCBAQAogICAgIH0KIAogICAgIHdoaWxlIChiaXQgJiBtYXNrKSB7Ci0gICAgICAgIGlmICghKG5leHQgPSBuZ3hfcmFkaXhfYWxsb2ModHJlZSwgc2l6ZW9mKG5neF9yYWRpeF9ub2RlX3QpKSkpIHsKKyAgICAgICAgaWYgKCEobmV4dCA9IG5neF9yYWRpeF9hbGxvYyh0cmVlKSkpIHsKICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgICAgIH0KIAotICAgICAgICBuZXh0LT52YWx1ZSA9IHZhbHVlOwogICAgICAgICBuZXh0LT5yaWdodCA9IE5VTEw7CiAgICAgICAgIG5leHQtPmxlZnQgPSBOVUxMOwogICAgICAgICBuZXh0LT5wYXJlbnQgPSBub2RlOworICAgICAgICBuZXh0LT52YWx1ZSA9IE5HWF9SQURJWF9OT19WQUxVRTsKIAogICAgICAgICBpZiAoa2V5ICYgYml0KSB7CiAgICAgICAgICAgICBub2RlLT5yaWdodCA9IG5leHQ7CkBAIC05NCw2ICs5NCw4IEBACiAgICAgICAgIG5vZGUgPSBuZXh0OwogICAgIH0KIAorICAgIG5vZGUtPnZhbHVlID0gdmFsdWU7CisKICAgICByZXR1cm4gTkdYX09LOwogfQogCkBAIC0xMjMsOCArMTI1LDEyIEBACiAgICAgfQogCiAgICAgaWYgKG5vZGUtPnJpZ2h0IHx8IG5vZGUtPmxlZnQpIHsKLSAgICAgICAgbm9kZS0+dmFsdWUgPSAodWludHB0cl90KSAwOwotICAgICAgICByZXR1cm4gTkdYX09LOworICAgICAgICBpZiAobm9kZS0+dmFsdWUgIT0gTkdYX1JBRElYX05PX1ZBTFVFKSB7CisgICAgICAgICAgICBub2RlLT52YWx1ZSA9IE5HWF9SQURJWF9OT19WQUxVRTsKKyAgICAgICAgICAgIHJldHVybiBOR1hfT0s7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgIH0KIAogICAgIGZvciAoIDs7ICkgewpAQCAtMTM5LDcgKzE0NSwxMSBAQAogCiAgICAgICAgIG5vZGUgPSBub2RlLT5wYXJlbnQ7CiAKLSAgICAgICAgaWYgKG5vZGUtPnJpZ2h0IHx8IG5vZGUtPmxlZnQgfHwgbm9kZS0+dmFsdWUgfHwgbm9kZS0+cGFyZW50ID09IE5VTEwpIHsKKyAgICAgICAgaWYgKG5vZGUtPnJpZ2h0CisgICAgICAgICAgICB8fCBub2RlLT5sZWZ0CisgICAgICAgICAgICB8fCBub2RlLT52YWx1ZSAhPSBOR1hfUkFESVhfTk9fVkFMVUUKKyAgICAgICAgICAgIHx8IG5vZGUtPnBhcmVudCA9PSBOVUxMKQorICAgICAgICB7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KQEAgLTE1NSwxMSArMTY1LDExIEBACiAgICAgbmd4X3JhZGl4X25vZGVfdCAgKm5vZGU7CiAKICAgICBiaXQgPSAweDgwMDAwMDAwOwotICAgIHZhbHVlID0gKHVpbnRwdHJfdCkgMDsKKyAgICB2YWx1ZSA9IE5HWF9SQURJWF9OT19WQUxVRTsKICAgICBub2RlID0gdHJlZS0+cm9vdDsKIAogICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgIGlmIChub2RlLT52YWx1ZSkgeworICAgICAgICBpZiAobm9kZS0+dmFsdWUgIT0gTkdYX1JBRElYX05PX1ZBTFVFKSB7CiAgICAgICAgICAgICB2YWx1ZSA9IG5vZGUtPnZhbHVlOwogICAgICAgICB9CiAKQEAgLTE3Nyw3ICsxODcsNyBAQAogfQogCiAKLXN0YXRpYyB2b2lkICpuZ3hfcmFkaXhfYWxsb2Mobmd4X3JhZGl4X3RyZWVfdCAqdHJlZSwgc2l6ZV90IHNpemUpCitzdGF0aWMgdm9pZCAqbmd4X3JhZGl4X2FsbG9jKG5neF9yYWRpeF90cmVlX3QgKnRyZWUpCiB7CiAgICAgY2hhciAgKnA7CiAKQEAgLTE4Nyw3ICsxOTcsNyBAQAogICAgICAgICByZXR1cm4gcDsKICAgICB9CiAKLSAgICBpZiAodHJlZS0+c2l6ZSA8IHNpemUpIHsKKyAgICBpZiAodHJlZS0+c2l6ZSA8IHNpemVvZihuZ3hfcmFkaXhfbm9kZV90KSkgewogICAgICAgICBpZiAoISh0cmVlLT5zdGFydCA9IG5neF9wYWxsb2ModHJlZS0+cG9vbCwgbmd4X3BhZ2VzaXplKSkpIHsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CkBAIC0xOTYsOCArMjA2LDggQEAKICAgICB9CiAKICAgICBwID0gdHJlZS0+c3RhcnQ7Ci0gICAgdHJlZS0+c3RhcnQgKz0gc2l6ZTsKLSAgICB0cmVlLT5zaXplIC09IHNpemU7CisgICAgdHJlZS0+c3RhcnQgKz0gc2l6ZW9mKG5neF9yYWRpeF9ub2RlX3QpOworICAgIHRyZWUtPnNpemUgLT0gc2l6ZW9mKG5neF9yYWRpeF9ub2RlX3QpOwogCiAgICAgcmV0dXJuIHA7CiB9CmRpZmYgLS1naXQgYS9zcmMvY29yZS9uZ3hfcmFkaXhfdHJlZS5oIGIvc3JjL2NvcmUvbmd4X3JhZGl4X3RyZWUuaAppbmRleCA1Mzk4ZDA2Li5jMmQ4YTM2IDEwMDY0NAotLS0gYS9zcmMvY29yZS9uZ3hfcmFkaXhfdHJlZS5oCisrKyBiL3NyYy9jb3JlL25neF9yYWRpeF90cmVlLmgKQEAgLTEyLDYgKzEyLDggQEAKICNpbmNsdWRlIDxuZ3hfY29yZS5oPgogCiAKKyNkZWZpbmUgTkdYX1JBRElYX05PX1ZBTFVFICAgKHVpbnRwdHJfdCkgLTEKKwogdHlwZWRlZiBzdHJ1Y3Qgbmd4X3JhZGl4X25vZGVfcyAgbmd4X3JhZGl4X25vZGVfdDsKIAogc3RydWN0IG5neF9yYWRpeF9ub2RlX3MgewpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbmd4X3N0cmluZy5jIGIvc3JjL2NvcmUvbmd4X3N0cmluZy5jCmluZGV4IDM3YTc1YWEuLmQ2M2EyMzggMTAwNjQ0Ci0tLSBhL3NyYy9jb3JlL25neF9zdHJpbmcuYworKysgYi9zcmMvY29yZS9uZ3hfc3RyaW5nLmMKQEAgLTI4LDYgKzI4LDIwIEBACiB9CiAKIAordV9jaGFyICpuZ3hfcHN0cmR1cChuZ3hfcG9vbF90ICpwb29sLCBuZ3hfc3RyX3QgKnNyYykKK3sKKyAgICB1X2NoYXIgICpkc3Q7CisKKyAgICBpZiAoIShkc3QgPSBuZ3hfcGFsbG9jKHBvb2wsIHNyYy0+bGVuKSkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgbmd4X21lbWNweShkc3QsIHNyYy0+ZGF0YSwgc3JjLT5sZW4pOworCisgICAgcmV0dXJuIGRzdDsKK30KKworCiAvKgogICogc3VwcG9ydGVkIGZvcm1hdHM6CiAgKiAgICAlWzBdW3dpZHRoXVt4XVtYXU8gICAgICAgIG9mZl90CkBAIC02MDIsMTMgKzYxNiwxNCBAQAogfQogCiAKLW5neF91aW50X3Qgbmd4X2VzY2FwZV91cmkodV9jaGFyICpkc3QsIHVfY2hhciAqc3JjLCBzaXplX3Qgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X3VpbnRfdCB0eXBlKQordWludHB0cl90IG5neF9lc2NhcGVfdXJpKHVfY2hhciAqZHN0LCB1X2NoYXIgKnNyYywgc2l6ZV90IHNpemUsIG5neF91aW50X3QgdHlwZSkKIHsKICAgICBuZ3hfdWludF90ICAgICAgICBpLCBuOwogICAgIHVpbnQzMl90ICAgICAgICAgKmVzY2FwZTsKICAgICBzdGF0aWMgdV9jaGFyICAgICBoZXhbXSA9ICIwMTIzNDU2Nzg5YWJjZGVmIjsKIAorICAgICAgICAgICAgICAgICAgICAgIC8qICIgIiwgIiUiLCAiPyIsICUwMC0lMUYsICU3Ri0lRkYgKi8KKwogICAgIHN0YXRpYyB1aW50MzJfdCAgIHVyaVtdID0KICAgICAgICAgeyAweGZmZmZmZmZmLCAvKiAxMTExIDExMTEgMTExMSAxMTExICAxMTExIDExMTEgMTExMSAxMTExICovCiAKQEAgLTYyNiw2ICs2NDEsMjcgQEAKICAgICAgICAgICAweGZmZmZmZmZmLCAvKiAxMTExIDExMTEgMTExMSAxMTExICAxMTExIDExMTEgMTExMSAxMTExICovCiAgICAgICAgICAgMHhmZmZmZmZmZiAgLyogMTExMSAxMTExIDExMTEgMTExMSAgMTExMSAxMTExIDExMTEgMTExMSAqLyB9OwogCisgICAgICAgICAgICAgICAgICAgICAgLyogIiAiLCAiJSIsICIrIiwgIj8iLCAlMDAtJTFGLCAlN0YtJUZGICovCisKKyAgICBzdGF0aWMgdWludDMyX3QgICBhcmdzW10gPQorICAgICAgICB7IDB4ZmZmZmZmZmYsIC8qIDExMTEgMTExMSAxMTExIDExMTEgIDExMTEgMTExMSAxMTExIDExMTEgKi8KKworICAgICAgICAgICAgICAgICAgICAgIC8qID8+PTwgOzo5OCA3NjU0IDMyMTAgIC8uLSwgKyopKCAnJiUkICMiISAgKi8KKyAgICAgICAgICAweDgwMDAwODIxLCAvKiAxMDAwIDAwMDAgMDAwMCAwMDAwICAwMDAwIDEwMDAgMDAxMCAwMDAxICovCisKKyAgICAgICAgICAgICAgICAgICAgICAvKiBfXl1cIFtaWVggV1ZVVCBTUlFQICBPTk1MIEtKSUggR0ZFRCBDQkFAICovCisgICAgICAgICAgMHgwMDAwMDAwMCwgLyogMDAwMCAwMDAwIDAwMDAgMDAwMCAgMDAwMCAwMDAwIDAwMDAgMDAwMCAqLworCisgICAgICAgICAgICAgICAgICAgICAgLyogIH59fCB7enl4IHd2dXQgc3JxcCAgb25tbCBramloIGdmZWQgY2JhYCAqLworICAgICAgICAgIDB4ODAwMDAwMDAsIC8qIDEwMDAgMDAwMCAwMDAwIDAwMDAgIDAwMDAgMDAwMCAwMDAwIDAwMDAgKi8KKworICAgICAgICAgIDB4ZmZmZmZmZmYsIC8qIDExMTEgMTExMSAxMTExIDExMTEgIDExMTEgMTExMSAxMTExIDExMTEgKi8KKyAgICAgICAgICAweGZmZmZmZmZmLCAvKiAxMTExIDExMTEgMTExMSAxMTExICAxMTExIDExMTEgMTExMSAxMTExICovCisgICAgICAgICAgMHhmZmZmZmZmZiwgLyogMTExMSAxMTExIDExMTEgMTExMSAgMTExMSAxMTExIDExMTEgMTExMSAqLworICAgICAgICAgIDB4ZmZmZmZmZmYgIC8qIDExMTEgMTExMSAxMTExIDExMTEgIDExMTEgMTExMSAxMTExIDExMTEgKi8gfTsKKworICAgICAgICAgICAgICAgICAgICAgIC8qICIgIiwgIiIiLCAiJSIsICInIiwgJTAwLSUxRiwgJTdGLSVGRiAqLworCiAgICAgc3RhdGljIHVpbnQzMl90ICAgaHRtbFtdID0KICAgICAgICAgeyAweGZmZmZmZmZmLCAvKiAxMTExIDExMTEgMTExMSAxMTExICAxMTExIDExMTEgMTExMSAxMTExICovCiAKQEAgLTY0NCwxMSArNjgwLDE2IEBACiAgICAgICAgICAgMHhmZmZmZmZmZiAgLyogMTExMSAxMTExIDExMTEgMTExMSAgMTExMSAxMTExIDExMTEgMTExMSAqLyB9OwogCiAKLSAgICBpZiAodHlwZSA9PSBOR1hfRVNDQVBFX0hUTUwpIHsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIE5HWF9FU0NBUEVfSFRNTDoKICAgICAgICAgZXNjYXBlID0gaHRtbDsKLQotICAgIH0gZWxzZSB7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTkdYX0VTQ0FQRV9BUkdTOgorICAgICAgICBlc2NhcGUgPSBhcmdzOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgogICAgICAgICBlc2NhcGUgPSB1cmk7CisgICAgICAgIGJyZWFrOwogICAgIH0KIAogICAgIGlmIChkc3QgPT0gTlVMTCkgewpAQCAtNjY0LDcgKzcwNSw3IEBACiAgICAgICAgICAgICBzcmMrKzsKICAgICAgICAgfQogCi0gICAgICAgIHJldHVybiBuOworICAgICAgICByZXR1cm4gKHVpbnRwdHJfdCkgbjsKICAgICB9CiAKICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CkBAIC02NzksNSArNzIwLDUgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiAwOworICAgIHJldHVybiAodWludHB0cl90KSBkc3Q7CiB9CmRpZmYgLS1naXQgYS9zcmMvY29yZS9uZ3hfc3RyaW5nLmggYi9zcmMvY29yZS9uZ3hfc3RyaW5nLmgKaW5kZXggYWJlZjgyZC4uNzY2ODgwNyAxMDA2NDQKLS0tIGEvc3JjL2NvcmUvbmd4X3N0cmluZy5oCisrKyBiL3NyYy9jb3JlL25neF9zdHJpbmcuaApAQCAtNzIsNiArNzIsNyBAQAogCiAKIHVfY2hhciAqbmd4X2NweXN0cm4odV9jaGFyICpkc3QsIHVfY2hhciAqc3JjLCBzaXplX3Qgbik7Cit1X2NoYXIgKm5neF9wc3RyZHVwKG5neF9wb29sX3QgKnBvb2wsIG5neF9zdHJfdCAqc3JjKTsKIHVfY2hhciAqbmd4X3NwcmludGYodV9jaGFyICpidWYsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKIHVfY2hhciAqbmd4X3NucHJpbnRmKHVfY2hhciAqYnVmLCBzaXplX3QgbWF4LCBjb25zdCBjaGFyICpmbXQsIC4uLik7CiB1X2NoYXIgKm5neF92c25wcmludGYodV9jaGFyICpidWYsIHNpemVfdCBtYXgsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcmdzKTsKQEAgLTkzLDEwICs5NCwxMSBAQAogCiAKICNkZWZpbmUgTkdYX0VTQ0FQRV9VUkkgICAwCi0jZGVmaW5lIE5HWF9FU0NBUEVfSFRNTCAgMQorI2RlZmluZSBOR1hfRVNDQVBFX0FSR1MgIDEKKyNkZWZpbmUgTkdYX0VTQ0FQRV9IVE1MICAyCiAKLW5neF91aW50X3Qgbmd4X2VzY2FwZV91cmkodV9jaGFyICpkc3QsIHVfY2hhciAqc3JjLCBzaXplX3Qgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X3VpbnRfdCB0eXBlKTsKK3VpbnRwdHJfdCBuZ3hfZXNjYXBlX3VyaSh1X2NoYXIgKmRzdCwgdV9jaGFyICpzcmMsIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5neF91aW50X3QgdHlwZSk7CiAKIAogI2RlZmluZSAgbmd4X3Fzb3J0ICAgICAgICAgICAgICAgIHFzb3J0CmRpZmYgLS1naXQgYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2FjY2Vzc19oYW5kbGVyLmMgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2FjY2Vzc19oYW5kbGVyLmMKaW5kZXggMDE3OTY4OS4uODMyZjljMiAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9hY2Nlc3NfaGFuZGxlci5jCisrKyBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfYWNjZXNzX2hhbmRsZXIuYwpAQCAtMTU4LDcgKzE1OCw3IEBACiAgICAgfQogCiAgICAgaWYgKG5neF9wdG9jaWRyKCZ2YWx1ZVsxXSwgJmluX2NpZHIpID09IE5HWF9FUlJPUikgewotICAgICAgICBuZ3hfY29uZl9sb2dfZXJyb3IoTkdYX0xPR19FTUVSRywgY2YsIDAsICJpbnZhbGlkIHBhcmFtdGVyIFwiJVZcIiIsCisgICAgICAgIG5neF9jb25mX2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBjZiwgMCwgImludmFsaWQgcGFyYW1ldGVyIFwiJVZcIiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVbMV0pOwogICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9mYXN0Y2dpX2hhbmRsZXIuYyBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfZmFzdGNnaV9oYW5kbGVyLmMKaW5kZXggOWY1MDE2YS4uODI4ZjdhYyAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9mYXN0Y2dpX2hhbmRsZXIuYworKysgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2Zhc3RjZ2lfaGFuZGxlci5jCkBAIC0yMCw2ICsyMCw4IEBACiAgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgICAgICByb290OwogICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg7CiAKKyAgICBuZ3hfYXJyYXlfdCAgICAgICAgICAgICAgICAgICAgIHZhcnM7CisKICAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgICAgICAgKmxvY2F0aW9uOwogfSBuZ3hfaHR0cF9mYXN0Y2dpX2xvY19jb25mX3Q7CiAKQEAgLTEzMCw2ICsxMzIsOCBAQAogCiBzdGF0aWMgY2hhciAqbmd4X2h0dHBfZmFzdGNnaV9wYXNzKG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpjbWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNvbmYpOworc3RhdGljIGNoYXIgKm5neF9odHRwX2Zhc3RjZ2lfc2V0X3ZhcihuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjb25mKTsKIHN0YXRpYyBjaGFyICpuZ3hfaHR0cF9mYXN0Y2dpX2xvd2F0X2NoZWNrKG5neF9jb25mX3QgKmNmLCB2b2lkICpwb3N0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSk7CiBzdGF0aWMgdm9pZCAqbmd4X2h0dHBfZmFzdGNnaV9jcmVhdGVfbG9jX2NvbmYobmd4X2NvbmZfdCAqY2YpOwpAQCAtMzA2LDYgKzMxMCwxMyBAQAogICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfZmFzdGNnaV9sb2NfY29uZl90LCB1cHN0cmVhbS5uZXh0X3Vwc3RyZWFtKSwKICAgICAgICZuZ3hfaHR0cF9mYXN0Y2dpX25leHRfdXBzdHJlYW1fbWFza3MgfSwKIAorICAgIHsgbmd4X3N0cmluZygiZmFzdGNnaV9zZXRfdmFyIiksCisgICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0NPTkZfVEFLRTEsCisgICAgICBuZ3hfaHR0cF9mYXN0Y2dpX3NldF92YXIsCisgICAgICBOR1hfSFRUUF9MT0NfQ09ORl9PRkZTRVQsCisgICAgICAwLAorICAgICAgTlVMTCB9LAorCiAgICAgeyBuZ3hfc3RyaW5nKCJmYXN0Y2dpX3BhcmFtcyIpLAogICAgICAgTkdYX0hUVFBfTUFJTl9DT05GfE5HWF9IVFRQX1NSVl9DT05GfE5HWF9IVFRQX0xPQ19DT05GfE5HWF9DT05GX0FOWSwKICAgICAgIG5neF9jb25mX3NldF9iaXRtYXNrX3Nsb3QsCkBAIC00MDUsMTQgKzQxNiwxOCBAQAogICAgIG5neF9idWZfdCAgICAgICAgICAgICAgICAgICAgICAgICAqYjsKICAgICBzb2NrbGVuX3QgICAgICAgICAgICAgICAgICAgICAgICAgIHNsZW47CiAgICAgbmd4X2NoYWluX3QgICAgICAgICAgICAgICAgICAgICAgICpjbCwgKmJvZHk7Ci0gICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgICAgICAgICBpLCBuLCBuZXh0OworICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICAgICAgICAgaSwgbiwgbmV4dCwgKnZpbmRleDsKICAgICBuZ3hfbGlzdF9wYXJ0X3QgICAgICAgICAgICAgICAgICAgKnBhcnQ7CiAgICAgbmd4X3RhYmxlX2VsdF90ICAgICAgICAgICAgICAgICAgICpoZWFkZXI7CiAgICAgc3RydWN0IHNvY2thZGRyX2luICAgICAgICAgICAgICAgICBzaW47CisgICAgbmd4X2h0dHBfdmFyaWFibGVfdCAgICAgICAgICAgICAgICp2YXI7CisgICAgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAgICAgICAgICp2YWx1ZTsKKyAgICBuZ3hfaHR0cF9jb3JlX21haW5fY29uZl90ICAgICAgICAgKmNtY2Y7CiAgICAgbmd4X2h0dHBfZmFzdGNnaV9oZWFkZXJfdCAgICAgICAgICpoOwogICAgIG5neF9odHRwX2Zhc3RjZ2lfbG9jX2NvbmZfdCAgICAgICAqZmxjZjsKICAgICBuZ3hfaHR0cF9mYXN0Y2dpX2JlZ2luX3JlcXVlc3RfdCAgKmJyOwogCisKICAgICBmbGNmID0gbmd4X2h0dHBfZ2V0X21vZHVsZV9sb2NfY29uZihyLCBuZ3hfaHR0cF9mYXN0Y2dpX21vZHVsZSk7CiAKICAgICBpZiAoKGZsY2YtPnBhcmFtcyAmIE5HWF9IVFRQX0ZBU1RDR0lfU0VSVkVSX0FERFIpICYmIHItPmluX2FkZHIgPT0gMCkgewpAQCAtNTE4LDYgKzUzMywyMyBAQAogICAgIH0KIAogCisgICAgY21jZiA9IG5neF9odHRwX2dldF9tb2R1bGVfbWFpbl9jb25mKHIsIG5neF9odHRwX2NvcmVfbW9kdWxlKTsKKworICAgIHZhciA9IGNtY2YtPnZhcmlhYmxlcy5lbHRzOworICAgIHZpbmRleCA9IGZsY2YtPnZhcnMuZWx0czsKKworICAgIGZvciAoaSA9IDA7IGkgPCBmbGNmLT52YXJzLm5lbHRzOyBpKyspIHsKKworICAgICAgICBpZiAoISh2YWx1ZSA9IG5neF9odHRwX2dldF92YXJpYWJsZShyLCB2aW5kZXhbaV0pKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAodmFsdWUtPnRleHQubGVuKSB7CisgICAgICAgICAgICBsZW4gKz0gMSArIDEgKyB2YXJbdmluZGV4W2ldXS5uYW1lLmxlbiArIHZhbHVlLT50ZXh0LmxlbjsKKyAgICAgICAgfQorICAgIH0KKworCiAgICAgcGFydCA9ICZyLT5oZWFkZXJzX2luLmhlYWRlcnMucGFydDsKICAgICBoZWFkZXIgPSBwYXJ0LT5lbHRzOwogCkBAIC04NTAsNiArODgyLDI2IEBACiAgICAgfQogCiAKKyAgICBmb3IgKGkgPSAwOyBpIDwgZmxjZi0+dmFycy5uZWx0czsgaSsrKSB7CisKKyAgICAgICAgaWYgKCEodmFsdWUgPSBuZ3hfaHR0cF9nZXRfdmFyaWFibGUociwgdmluZGV4W2ldKSkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHZhbHVlLT50ZXh0LmxlbiA9PSAwKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgICpiLT5sYXN0KysgPSAodV9jaGFyKSB2YXJbdmluZGV4W2ldXS5uYW1lLmxlbjsKKyAgICAgICAgKmItPmxhc3QrKyA9ICh1X2NoYXIpIHZhbHVlLT50ZXh0LmxlbjsKKworICAgICAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCB2YXJbdmluZGV4W2ldXS5uYW1lLmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhclt2aW5kZXhbaV1dLm5hbWUubGVuKTsKKworICAgICAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCB2YWx1ZS0+dGV4dC5kYXRhLCB2YWx1ZS0+dGV4dC5sZW4pOworICAgIH0KKworCiAgICAgcGFydCA9ICZyLT5oZWFkZXJzX2luLmhlYWRlcnMucGFydDsKICAgICBoZWFkZXIgPSBwYXJ0LT5lbHRzOwogCkBAIC0xNzYzLDcgKzE4MTUsMTEgQEAKIAogICAgIGNsY2YtPmhhbmRsZXIgPSBuZ3hfaHR0cF9mYXN0Y2dpX2hhbmRsZXI7CiAKKyNpZiAoTkdYX1BDUkUpCiAgICAgbGNmLT5sb2NhdGlvbiA9IGNsY2YtPnJlZ2V4ID8gJm5neF9odHRwX2Zhc3RjZ2lfdXJpOiAmY2xjZi0+bmFtZTsKKyNlbHNlCisgICAgbGNmLT5sb2NhdGlvbiA9ICZjbGNmLT5uYW1lOworI2VuZGlmCiAKICAgICBpZiAoY2xjZi0+bmFtZS5kYXRhW2NsY2YtPm5hbWUubGVuIC0gMV0gPT0gJy8nKSB7CiAgICAgICAgIGNsY2YtPmF1dG9fcmVkaXJlY3QgPSAxOwpAQCAtMTc3Myw2ICsxODI5LDQ3IEBACiB9CiAKIAorc3RhdGljIGNoYXIgKm5neF9odHRwX2Zhc3RjZ2lfc2V0X3ZhcihuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjb25mKQoreworICAgIG5neF9odHRwX2Zhc3RjZ2lfbG9jX2NvbmZfdCAqbGNmID0gY29uZjsKKworICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICBpLCAqaW5kZXg7CisgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgKnZhbHVlOworICAgIG5neF9odHRwX3ZhcmlhYmxlX3QgICAgICAgICp2YXI7CisgICAgbmd4X2h0dHBfY29yZV9tYWluX2NvbmZfdCAgKmNtY2Y7CisKKyAgICBpZiAobGNmLT52YXJzLmVsdHMgPT0gTlVMTCkgeworICAgICAgICBpZiAobmd4X2FycmF5X2luaXQoJmxjZi0+dmFycywgY2YtPnBvb2wsIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yobmd4X2h0dHBfdmFyaWFibGVfdCAqKSkgPT0gTkdYX0VSUk9SKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbWNmID0gbmd4X2h0dHBfY29uZl9nZXRfbW9kdWxlX21haW5fY29uZihjZiwgbmd4X2h0dHBfY29yZV9tb2R1bGUpOworCisgICAgdmFsdWUgPSBjZi0+YXJncy0+ZWx0czsKKworICAgIHZhciA9IGNtY2YtPnZhcmlhYmxlcy5lbHRzOworICAgIGZvciAoaSA9IDA7IGkgPCBjbWNmLT52YXJpYWJsZXMubmVsdHM7IGkrKykgeworICAgICAgICBpZiAobmd4X3N0cmNhc2VjbXAodmFyW2ldLm5hbWUuZGF0YSwgdmFsdWVbMV0uZGF0YSkgPT0gMCkgeworCisgICAgICAgICAgICBpZiAoIShpbmRleCA9IG5neF9hcnJheV9wdXNoKCZsY2YtPnZhcnMpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgKmluZGV4ID0gdmFyW2ldLmluZGV4OworICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX09LOworICAgICAgICB9CisgICAgfQorCisgICAgbmd4X2NvbmZfbG9nX2Vycm9yKE5HWF9MT0dfRU1FUkcsIGNmLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAidW5rbm93biB2YXJpYWJsZSBuYW1lIFwiJVZcIiIsICZ2YWx1ZVsxXSk7CisgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworfQorCisKIHN0YXRpYyBjaGFyICpuZ3hfaHR0cF9mYXN0Y2dpX2xvd2F0X2NoZWNrKG5neF9jb25mX3QgKmNmLCB2b2lkICpwb3N0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSkKIHsKZGlmZiAtLWdpdCBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfZ2VvX21vZHVsZS5jIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9nZW9fbW9kdWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q3NzQ4OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfZ2VvX21vZHVsZS5jCkBAIC0wLDAgKzEsMjUyIEBACisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIElnb3IgU3lzb2V2CisgKi8KKworCisjaW5jbHVkZSA8bmd4X2NvbmZpZy5oPgorI2luY2x1ZGUgPG5neF9jb3JlLmg+CisjaW5jbHVkZSA8bmd4X2h0dHAuaD4KKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgbmd4X3JhZGl4X3RyZWVfdCAgICAgICAgICAgKnRyZWU7CisgICAgbmd4X3Bvb2xfdCAgICAgICAgICAgICAgICAgKnBvb2w7CisgICAgbmd4X2FycmF5X3QgICAgICAgICAgICAgICAgIHZhbHVlczsKK30gbmd4X2h0dHBfZ2VvX2NvbmZfdDsKKworCitzdGF0aWMgY2hhciAqbmd4X2h0dHBfZ2VvX2Jsb2NrKG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpjbWQsIHZvaWQgKmNvbmYpOworc3RhdGljIGNoYXIgKm5neF9odHRwX2dlbyhuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqZHVtbXksIHZvaWQgKmNvbmYpOworCisKK3N0YXRpYyBuZ3hfY29tbWFuZF90ICBuZ3hfaHR0cF9nZW9fY29tbWFuZHNbXSA9IHsKKworICAgIHsgbmd4X3N0cmluZygiZ2VvIiksCisgICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0NPTkZfQkxPQ0t8TkdYX0NPTkZfVEFLRTEsCisgICAgICBuZ3hfaHR0cF9nZW9fYmxvY2ssCisgICAgICBOR1hfSFRUUF9NQUlOX0NPTkZfT0ZGU0VULAorICAgICAgMCwKKyAgICAgIE5VTEwgfSwKKworICAgICAgbmd4X251bGxfY29tbWFuZAorfTsKKworCitzdGF0aWMgbmd4X2h0dHBfbW9kdWxlX3QgIG5neF9odHRwX2dlb19tb2R1bGVfY3R4ID0geworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByZSBjb25mICovCisKKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjcmVhdGUgbWFpbiBjb25maWd1cmF0aW9uICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdCBtYWluIGNvbmZpZ3VyYXRpb24gKi8KKworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSBzZXJ2ZXIgY29uZmlndXJhdGlvbiAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1lcmdlIHNlcnZlciBjb25maWd1cmF0aW9uICovCisKKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjcmVhdGUgbG9jYXRpb24gY29uZmlndXJhdGlvbiAqLworICAgIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1lcmdlIGxvY2F0aW9uIGNvbmZpZ3VyYXRpb24gKi8KK307CisKKworbmd4X21vZHVsZV90ICBuZ3hfaHR0cF9nZW9fbW9kdWxlID0geworICAgIE5HWF9NT0RVTEUsCisgICAgJm5neF9odHRwX2dlb19tb2R1bGVfY3R4LCAgICAgICAgICAgICAgLyogbW9kdWxlIGNvbnRleHQgKi8KKyAgICBuZ3hfaHR0cF9nZW9fY29tbWFuZHMsICAgICAgICAgICAgICAgICAvKiBtb2R1bGUgZGlyZWN0aXZlcyAqLworICAgIE5HWF9IVFRQX01PRFVMRSwgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vZHVsZSB0eXBlICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdCBtb2R1bGUgKi8KKyAgICBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0IHByb2Nlc3MgKi8KK307CisKKworc3RhdGljIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgIG5neF9odHRwX2dlb19udWxsX3ZhbHVlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAwLCBuZ3hfc3RyaW5nKCIwIikgfTsKKworCisvKiBBRl9JTkVUIG9ubHkgKi8KKworc3RhdGljIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgKm5neF9odHRwX2dlb192YXJpYWJsZShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEpCit7CisgICAgbmd4X3JhZGl4X3RyZWVfdCAqdHJlZSA9IGRhdGE7CisKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gICpzaW47CisKKyAgICBzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopIHItPmNvbm5lY3Rpb24tPnNvY2thZGRyOworCisgICAgcmV0dXJuIChuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICopCisgICAgICAgICAgICAgICAgICAgICAgIG5neF9yYWRpeDMydHJlZV9maW5kKHRyZWUsIG50b2hsKHNpbi0+c2luX2FkZHIuc19hZGRyKSk7Cit9CisKKworc3RhdGljIGNoYXIgKm5neF9odHRwX2dlb19ibG9jayhuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLCB2b2lkICpjb25mKQoreworICAgIGNoYXIgICAgICAgICAgICAgICAgICpydjsKKyAgICBuZ3hfc3RyX3QgICAgICAgICAgICAqdmFsdWU7CisgICAgbmd4X2NvbmZfdCAgICAgICAgICAgIHNhdmU7CisgICAgbmd4X3Bvb2xfdCAgICAgICAgICAgKnBvb2w7CisgICAgbmd4X3JhZGl4X3RyZWVfdCAgICAgKnRyZWU7CisgICAgbmd4X2h0dHBfZ2VvX2NvbmZfdCAgIGdlbzsKKyAgICBuZ3hfaHR0cF92YXJpYWJsZV90ICAqdmFyOworCisgICAgaWYgKCEodmFyID0gbmd4X2h0dHBfYWRkX3ZhcmlhYmxlKGNmKSkpIHsKKyAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgIH0KKworICAgIGlmICghKHRyZWUgPSBuZ3hfcmFkaXhfdHJlZV9jcmVhdGUoY2YtPnBvb2wpKSkgeworICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgfQorCisgICAgdmFsdWUgPSBjZi0+YXJncy0+ZWx0czsKKworICAgIHZhci0+bmFtZSA9IHZhbHVlWzFdOworICAgIHZhci0+aGFuZGxlciA9IG5neF9odHRwX2dlb192YXJpYWJsZTsKKyAgICB2YXItPmRhdGEgPSB0cmVlOworCisgICAgLyoKKyAgICAgKiBjcmVhdGUgdGhlIHRlbXBvcmFyeSBwb29sIG9mIGEgaHVnZSBpbml0aWFsIHNpemUKKyAgICAgKiB0byBwcm9jZXNzIHF1aWNrbHkgYSBsYXJnZSBudW1iZXIgb2YgZ2VvIGxpbmVzCisgICAgICovCisKKyAgICBpZiAoIShwb29sID0gbmd4X2NyZWF0ZV9wb29sKDUxMiAqIDEwMjQsIGNmLT5sb2cpKSkgeworICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgfQorCisgICAgaWYgKG5neF9hcnJheV9pbml0KCZnZW8udmFsdWVzLCBwb29sLCA1MTIsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICopKSA9PSBOR1hfRVJST1IpCisgICAgeworICAgICAgICBuZ3hfZGVzdHJveV9wb29sKHBvb2wpOworICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgfQorCisgICAgZ2VvLnRyZWUgPSB0cmVlOworICAgIGdlby5wb29sID0gY2YtPnBvb2w7CisKKyAgICBzYXZlID0gKmNmOworICAgIGNmLT5wb29sID0gcG9vbDsKKyAgICBjZi0+Y3R4ID0gJmdlbzsKKyAgICBjZi0+aGFuZGxlciA9IG5neF9odHRwX2dlbzsKKyAgICBjZi0+aGFuZGxlcl9jb25mID0gY29uZjsKKworICAgIHJ2ID0gbmd4X2NvbmZfcGFyc2UoY2YsIE5VTEwpOworCisgICAgKmNmID0gc2F2ZTsKKworICAgIG5neF9kZXN0cm95X3Bvb2wocG9vbCk7CisKKyAgICBpZiAobmd4X3JhZGl4MzJ0cmVlX2ZpbmQodHJlZSwgMCkgIT0gTkdYX1JBRElYX05PX1ZBTFVFKSB7CisgICAgICAgIHJldHVybiBydjsKKyAgICB9CisKKyAgICBpZiAobmd4X3JhZGl4MzJ0cmVlX2luc2VydCh0cmVlLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50cHRyX3QpICZuZ3hfaHR0cF9nZW9fbnVsbF92YWx1ZSkgPT0gTkdYX0VSUk9SKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBydjsKK30KKworCisvKiBBRl9JTkVUIG9ubHkgKi8KKworc3RhdGljIGNoYXIgKm5neF9odHRwX2dlbyhuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqZHVtbXksIHZvaWQgKmNvbmYpCit7CisgICAgbmd4X2ludF90ICAgICAgICAgICAgICAgICAgIHJjLCBuOworICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICBpOworICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICp2YWx1ZSwgZmlsZTsKKyAgICBuZ3hfaW5ldF9jaWRyX3QgICAgICAgICAgICAgY2lkcmluOworICAgIG5neF9odHRwX2dlb19jb25mX3QgICAgICAgICpnZW87CisgICAgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAgKnZhciwgKip2OworCisgICAgZ2VvID0gY2YtPmN0eDsKKworICAgIGlmIChjZi0+YXJncy0+bmVsdHMgIT0gMikgeworICAgICAgICBuZ3hfY29uZl9sb2dfZXJyb3IoTkdYX0xPR19FTUVSRywgY2YsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBudW1iZXIgb2YgdGhlIGdlbyBwYXJhbWV0ZXJzIik7CisgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICB9CisKKyAgICB2YWx1ZSA9IGNmLT5hcmdzLT5lbHRzOworCisgICAgaWYgKG5neF9zdHJjbXAodmFsdWVbMF0uZGF0YSwgImluY2x1ZGUiKSA9PSAwKSB7CisgICAgICAgIGZpbGUgPSB2YWx1ZVsxXTsKKworICAgICAgICBpZiAobmd4X2NvbmZfZnVsbF9uYW1lKGNmLT5jeWNsZSwgJmZpbGUpID09IE5HWF9FUlJPUil7CisgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBuZ3hfbG9nX2RlYnVnMShOR1hfTE9HX0RFQlVHX0NPUkUsIGNmLT5sb2csIDAsICJpbmNsdWRlICVzIiwgZmlsZS5kYXRhKTsKKworICAgICAgICByZXR1cm4gbmd4X2NvbmZfcGFyc2UoY2YsICZmaWxlKTsKKyAgICB9CisKKyAgICBpZiAobmd4X3N0cmNtcCh2YWx1ZVswXS5kYXRhLCAiZGVmYXVsdCIpID09IDApIHsKKyAgICAgICAgY2lkcmluLmFkZHIgPSAwOworICAgICAgICBjaWRyaW4ubWFzayA9IDA7CisKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAobmd4X3B0b2NpZHIoJnZhbHVlWzBdLCAmY2lkcmluKSA9PSBOR1hfRVJST1IpIHsKKyAgICAgICAgICAgIG5neF9jb25mX2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBjZiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBwYXJhbWV0ZXIgXCIlVlwiIiwgJnZhbHVlWzBdKTsKKyAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGNpZHJpbi5hZGRyID0gbnRvaGwoY2lkcmluLmFkZHIpOworICAgICAgICBjaWRyaW4ubWFzayA9IG50b2hsKGNpZHJpbi5tYXNrKTsKKyAgICB9CisKKyAgICBuID0gbmd4X2F0b2kodmFsdWVbMV0uZGF0YSwgdmFsdWVbMV0ubGVuKTsKKworICAgIHZhciA9IE5VTEw7CisgICAgdiA9IGdlby0+dmFsdWVzLmVsdHM7CisKKyAgICBpZiAobiA9PSBOR1hfRVJST1IpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGdlby0+dmFsdWVzLm5lbHRzOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChuZ3hfc3RyY21wKHZhbHVlWzFdLmRhdGEsIHZbaV0tPnRleHQuZGF0YSkgPT0gMCkgeworICAgICAgICAgICAgICAgIHZhciA9IHZbaV07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBnZW8tPnZhbHVlcy5uZWx0czsgaSsrKSB7CisgICAgICAgICAgICBpZiAodltpXS0+dmFsdWUgPT0gKG5neF91aW50X3QpIG4pIHsKKyAgICAgICAgICAgICAgICB2YXIgPSB2W2ldOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGkgPT0gZ2VvLT52YWx1ZXMubmVsdHMpIHsKKyAgICAgICAgdmFyID0gbmd4X3BhbGxvYyhnZW8tPnBvb2wsIHNpemVvZihuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90KSk7CisgICAgICAgIGlmICh2YXIgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgdmFyLT50ZXh0LmxlbiA9IHZhbHVlWzFdLmxlbjsKKyAgICAgICAgaWYgKCEodmFyLT50ZXh0LmRhdGEgPSBuZ3hfcHN0cmR1cChnZW8tPnBvb2wsICZ2YWx1ZVsxXSkpKSB7CisgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICB2YXItPnZhbHVlID0gKG4gPT0gTkdYX0VSUk9SKSA/IDAgOiBuOworCisgICAgICAgIGlmICghKHYgPSBuZ3hfYXJyYXlfcHVzaCgmZ2VvLT52YWx1ZXMpKSkgeworICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgKnYgPSB2YXI7CisgICAgfQorCisgICAgcmMgPSBuZ3hfcmFkaXgzMnRyZWVfaW5zZXJ0KGdlby0+dHJlZSwgY2lkcmluLmFkZHIsIGNpZHJpbi5tYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludHB0cl90KSB2YXIpOworICAgIGlmIChyYyA9PSBOR1hfRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgIH0KKworICAgIGlmIChyYyA9PSBOR1hfQlVTWSkgeworICAgICAgICBuZ3hfY29uZl9sb2dfZXJyb3IoTkdYX0xPR19FTUVSRywgY2YsIDAsICJkdXBsaWNhdGUgcGFyYW1ldGVyIFwiJVZcIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVbMF0pOworICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE5HWF9DT05GX09LOworfQpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9nemlwX2ZpbHRlci5jIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9nemlwX2ZpbHRlci5jCmluZGV4IGNkYTljYTMuLmNjZjVkYzQgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfZ3ppcF9maWx0ZXIuYworKysgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2d6aXBfZmlsdGVyLmMKQEAgLTEzMiw3ICsxMzIsOCBAQAogc3RhdGljIG5neF9jb21tYW5kX3QgIG5neF9odHRwX2d6aXBfZmlsdGVyX2NvbW1hbmRzW10gPSB7CiAKICAgICB7IG5neF9zdHJpbmcoImd6aXAiKSwKLSAgICAgIE5HWF9IVFRQX01BSU5fQ09ORnxOR1hfSFRUUF9TUlZfQ09ORnxOR1hfSFRUUF9MT0NfQ09ORnxOR1hfQ09ORl9GTEFHLAorICAgICAgTkdYX0hUVFBfTUFJTl9DT05GfE5HWF9IVFRQX1NSVl9DT05GfE5HWF9IVFRQX0xPQ19DT05GfE5HWF9IVFRQX0xJRl9DT05GCisgICAgICAgICAgICAgICAgICAgICAgICB8TkdYX0NPTkZfRkxBRywKICAgICAgIG5neF9jb25mX3NldF9mbGFnX3Nsb3QsCiAgICAgICBOR1hfSFRUUF9MT0NfQ09ORl9PRkZTRVQsCiAgICAgICBvZmZzZXRvZihuZ3hfaHR0cF9nemlwX2NvbmZfdCwgZW5hYmxlKSwKZGlmZiAtLWdpdCBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfcmV3cml0ZV9oYW5kbGVyLmMgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3Jld3JpdGVfaGFuZGxlci5jCmluZGV4IDYzNjMzMWIuLmIxZjU5MWMgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfcmV3cml0ZV9oYW5kbGVyLmMKKysrIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9yZXdyaXRlX2hhbmRsZXIuYwpAQCAtOSw3OSArOSwxNzAgQEAKICNpbmNsdWRlIDxuZ3hfaHR0cC5oPgogCiAKLSNkZWZpbmUgTkdYX0hUVFBfUkVXUklURV9DT1BZX0NBUFRVUkUgIDAKLSNkZWZpbmUgTkdYX0hUVFBfUkVXUklURV9DT1BZX1NIT1JUICAgIDEKLSNkZWZpbmUgTkdYX0hUVFBfUkVXUklURV9DT1BZX0xPTkcgICAgIDIKLSNkZWZpbmUgTkdYX0hUVFBfUkVXUklURV9TVEFSVF9BUkdTICAgIDMKK3R5cGVkZWYgc3RydWN0IG5neF9odHRwX3Jld3JpdGVfZW5naW5lX3MgIG5neF9odHRwX3Jld3JpdGVfZW5naW5lX3Q7CisKK3R5cGVkZWYgdm9pZCAoKm5neF9odHRwX3Jld3JpdGVfY29kZV9wdCkgKG5neF9odHRwX3Jld3JpdGVfZW5naW5lX3QgKmUpOwogCiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICBuZ3hfaW50X3QgICAgb3A7Ci0gICAgc2l6ZV90ICAgICAgIGxlbjsKLSAgICB1aW50cHRyX3QgICAgZGF0YTsKLX0gbmd4X2h0dHBfcmV3cml0ZV9vcF90OworICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICAgIG5hbWU7CisgICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgICAgd2lsZGNhcmQ7Cit9IG5neF9odHRwX3Jld3JpdGVfcmVmZXJlcl90OwogCiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICBuZ3hfcmVnZXhfdCAgKnJlZ2V4OwotICAgIG5neF91aW50X3QgICAgbmNhcHR1cmVzOworICAgIG5neF9hcnJheV90ICAgICAgICAgICAgICAgICAgKmNvZGVzOyAgICAgICAgLyogdWludHB0cl90ICovCisgICAgbmd4X2FycmF5X3QgICAgICAgICAgICAgICAgICAqcmVmZXJlcnM7ICAgICAvKiBuZ3hfaHR0cF9yZXdyaXRlX3JlZmVyZXJfdCAqLwogCi0gICAgbmd4X2FycmF5X3QgICBvcHM7Ci0gICAgbmd4X3VpbnRfdCAgICBzaXplOworICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICAgIG1heF9jYXB0dXJlczsKKyAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgICBzdGFja19zaXplOwogCi0gICAgbmd4X3N0cl90ICAgICByZV9uYW1lOwotICAgIG5neF9zdHJfdCAgICAgc19uYW1lOworICAgIG5neF9mbGFnX3QgICAgICAgICAgICAgICAgICAgIGxvZzsKIAotICAgIG5neF91aW50X3QgICAgc3RhdHVzOwotICAgIHVuc2lnbmVkICAgICAgbGFzdDoxOwotfSBuZ3hfaHR0cF9yZXdyaXRlX3J1bGVfdDsKLQotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgbmd4X2FycmF5X3QgICBydWxlczsKLSAgICBuZ3hfZmxhZ190ICAgIGxvZzsKLX0gbmd4X2h0dHBfcmV3cml0ZV9zcnZfY29uZl90OwotCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBuZ3hfc3RyX3QgICAgIHJlZGlyZWN0OworICAgIG5neF9mbGFnX3QgICAgICAgICAgICAgICAgICAgIG5vX3JlZmVyZXI7CiB9IG5neF9odHRwX3Jld3JpdGVfbG9jX2NvbmZfdDsKIAogCi1zdGF0aWMgdm9pZCAqbmd4X2h0dHBfcmV3cml0ZV9jcmVhdGVfc3J2X2NvbmYobmd4X2NvbmZfdCAqY2YpOwotc3RhdGljIGNoYXIgKm5neF9odHRwX3Jld3JpdGVfbWVyZ2Vfc3J2X2NvbmYobmd4X2NvbmZfdCAqY2YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwYXJlbnQsIHZvaWQgKmNoaWxkKTsKLXN0YXRpYyB2b2lkICpuZ3hfaHR0cF9yZXdyaXRlX2NyZWF0ZV9sb2NfY29uZihuZ3hfY29uZl90ICpjZik7Ci1zdGF0aWMgY2hhciAqbmd4X2h0dHBfcmV3cml0ZV9ydWxlKG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpjbWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNvbmYpOwotc3RhdGljIGNoYXIgKm5neF9odHRwX3JlZGlyZWN0KG5neF9jb25mX3QgKmNmLCB2b2lkICpwb3N0LCB2b2lkICpkYXRhKTsKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBuZ3hfaHR0cF9yZXdyaXRlX2NvZGVfcHQgICAgICBjb2RlOworICAgIG5neF9yZWdleF90ICAgICAgICAgICAgICAgICAgKnJlZ2V4OworICAgIHVpbnRwdHJfdCAgICAgICAgICAgICAgICAgICAgIHNpemU7CisgICAgdWludHB0cl90ICAgICAgICAgICAgICAgICAgICAgbmNhcHR1cmVzOworICAgIHVpbnRwdHJfdCAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKyAgICB1aW50cHRyX3QgICAgICAgICAgICAgICAgICAgICBuZXh0OworCisgICAgdWludHB0cl90ICAgICAgICAgICAgICAgICAgICAgdXJpOjE7CisKKyAgICAvKiBhZGQgdGhlIHItPmFyZ3MgdG8gdGhlIG5ldyBhcmd1bWVudHMgKi8KKyAgICB1aW50cHRyX3QgICAgICAgICAgICAgICAgICAgICBhcmdzOjE7CisKKyAgICB1aW50cHRyX3QgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdDoxOworCisgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgICAgbmFtZTsKK30gbmd4X2h0dHBfcmV3cml0ZV9yZWdleF9jb2RlX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIG5neF9odHRwX3Jld3JpdGVfY29kZV9wdCAgICAgIGNvZGU7CisKKyAgICB1aW50cHRyX3QgICAgICAgICAgICAgICAgICAgICB1cmk6MTsKKworICAgIC8qIGFkZCB0aGUgci0+YXJncyB0byB0aGUgbmV3IGFyZ3VtZW50cyAqLworICAgIHVpbnRwdHJfdCAgICAgICAgICAgICAgICAgICAgIGFyZ3M6MTsKKworICAgIHVpbnRwdHJfdCAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0OjE7Cit9IG5neF9odHRwX3Jld3JpdGVfcmVnZXhfZW5kX2NvZGVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIG5neF9odHRwX3Jld3JpdGVfY29kZV9wdCAgICAgIGNvZGU7CisgICAgdWludHB0cl90ICAgICAgICAgICAgICAgICAgICAgbjsKK30gbmd4X2h0dHBfcmV3cml0ZV9jb3B5X2NhcHR1cmVfY29kZV90OworCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBuZ3hfaHR0cF9yZXdyaXRlX2NvZGVfcHQgICAgICBjb2RlOworICAgIHVpbnRwdHJfdCAgICAgICAgICAgICAgICAgICAgIGxlbjsKK30gbmd4X2h0dHBfcmV3cml0ZV9jb3B5X2NvZGVfdDsKKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgbmd4X2h0dHBfcmV3cml0ZV9jb2RlX3B0ICAgICAgY29kZTsKKyAgICB1aW50cHRyX3QgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisgICAgdWludHB0cl90ICAgICAgICAgICAgICAgICAgICAgbnVsbDsKK30gbmd4X2h0dHBfcmV3cml0ZV9yZXR1cm5fY29kZV90OworCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBuZ3hfaHR0cF9yZXdyaXRlX2NvZGVfcHQgICAgICBjb2RlOworICAgIHVpbnRwdHJfdCAgICAgICAgICAgICAgICAgICAgIG5leHQ7CisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICoqbG9jX2NvbmY7Cit9IG5neF9odHRwX3Jld3JpdGVfaWZfY29kZV90OworCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBuZ3hfaHR0cF9yZXdyaXRlX2NvZGVfcHQgICAgICBjb2RlOworICAgIHVpbnRwdHJfdCAgICAgICAgICAgICAgICAgICAgIGluZGV4OworfSBuZ3hfaHR0cF9yZXdyaXRlX3Zhcl9jb2RlX3Q7CisKKworc3RydWN0IG5neF9odHRwX3Jld3JpdGVfZW5naW5lX3MgeworICAgIHVfY2hhciAgICAgICAgICAgICAgICAgICAgICAgKmlwOworICAgIHVpbnRwdHJfdCAgICAgICAgICAgICAgICAgICAgKnNwOworCisgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgICAgYnVmOworICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICAgKmxpbmU7CisKKyAgICB1X2NoYXIgICAgICAgICAgICAgICAgICAgICAgICpwb3M7CisKKyAgICAvKiB0aGUgc3RhcnQgb2YgdGhlIHJld3JpdHRlbiBhcmd1bWVudHMgKi8KKyAgICB1X2NoYXIgICAgICAgICAgICAgICAgICAgICAgICphcmdzOworCisgICAgdW5zaWduZWQgICAgICAgICAgICAgICAgICAgICAgcXVvdGU6MTsKKworICAgIG5neF9pbnRfdCAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgKmNhcHR1cmVzOworCisgICAgbmd4X2h0dHBfcmVxdWVzdF90ICAgICAgICAgICAqcmVxdWVzdDsKKyAgICBuZ3hfaHR0cF9yZXdyaXRlX2xvY19jb25mX3QgICpjb25mOworfTsKKworCiBzdGF0aWMgbmd4X2ludF90IG5neF9odHRwX3Jld3JpdGVfaW5pdChuZ3hfY3ljbGVfdCAqY3ljbGUpOwotCi0KLXN0YXRpYyBuZ3hfY29uZl9wb3N0X2hhbmRsZXJfcHQgIG5neF9odHRwX3JlZGlyZWN0X3AgPSBuZ3hfaHR0cF9yZWRpcmVjdDsKK3N0YXRpYyB2b2lkICpuZ3hfaHR0cF9yZXdyaXRlX2NyZWF0ZV9sb2NfY29uZihuZ3hfY29uZl90ICpjZik7CitzdGF0aWMgY2hhciAqbmd4X2h0dHBfcmV3cml0ZV9tZXJnZV9sb2NfY29uZihuZ3hfY29uZl90ICpjZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBhcmVudCwgdm9pZCAqY2hpbGQpOworc3RhdGljIGNoYXIgKm5neF9odHRwX3Jld3JpdGUobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwgdm9pZCAqY29uZik7CitzdGF0aWMgY2hhciAqbmd4X2h0dHBfcmV3cml0ZV9yZXR1cm4obmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjb25mKTsKK3N0YXRpYyBjaGFyICpuZ3hfaHR0cF9yZXdyaXRlX2lmKG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjb25mKTsKK3N0YXRpYyBjaGFyICpuZ3hfaHR0cF9yZXdyaXRlX3ZhbGlkX3JlZmVyZXJzKG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjb25mKTsKK3N0YXRpYyB2b2lkICpuZ3hfaHR0cF9yZXdyaXRlX3N0YXJ0X2NvZGUobmd4X3Bvb2xfdCAqcG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2FycmF5X3QgKipjb2Rlcywgc2l6ZV90IHNpemUpOworc3RhdGljIHZvaWQgKm5neF9odHRwX3Jld3JpdGVfYWRkX2NvZGUobmd4X2FycmF5X3QgKmNvZGVzLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqKm1haW4pOwogCiAKIHN0YXRpYyBuZ3hfY29tbWFuZF90ICBuZ3hfaHR0cF9yZXdyaXRlX2NvbW1hbmRzW10gPSB7CiAKICAgICB7IG5neF9zdHJpbmcoInJld3JpdGUiKSwKLSAgICAgIE5HWF9IVFRQX1NSVl9DT05GfE5HWF9DT05GX1RBS0UyMywKLSAgICAgIG5neF9odHRwX3Jld3JpdGVfcnVsZSwKLSAgICAgIE5HWF9IVFRQX1NSVl9DT05GX09GRlNFVCwKKyAgICAgIE5HWF9IVFRQX1NSVl9DT05GfE5HWF9IVFRQX1NJRl9DT05GfE5HWF9IVFRQX0xPQ19DT05GfE5HWF9IVFRQX0xJRl9DT05GCisgICAgICAgICAgICAgICAgICAgICAgIHxOR1hfQ09ORl9UQUtFMjMsCisgICAgICBuZ3hfaHR0cF9yZXdyaXRlLAorICAgICAgTkdYX0hUVFBfTE9DX0NPTkZfT0ZGU0VULAogICAgICAgMCwKICAgICAgIE5VTEwgfSwKIAotICAgIHsgbmd4X3N0cmluZygicmVkaXJlY3QiKSwKLSAgICAgIE5HWF9IVFRQX0xPQ19DT05GfE5HWF9DT05GX1RBS0UxLAotICAgICAgbmd4X2NvbmZfc2V0X3N0cl9zbG90LAorICAgIHsgbmd4X3N0cmluZygicmV0dXJuIiksCisgICAgICBOR1hfSFRUUF9TUlZfQ09ORnxOR1hfSFRUUF9TSUZfQ09ORnxOR1hfSFRUUF9MT0NfQ09ORnxOR1hfSFRUUF9MSUZfQ09ORgorICAgICAgICAgICAgICAgICAgICAgICB8TkdYX0NPTkZfVEFLRTEsCisgICAgICBuZ3hfaHR0cF9yZXdyaXRlX3JldHVybiwKICAgICAgIE5HWF9IVFRQX0xPQ19DT05GX09GRlNFVCwKICAgICAgIDAsCi0gICAgICAmbmd4X2h0dHBfcmVkaXJlY3RfcCB9LAorICAgICAgTlVMTCB9LAorCisgICAgeyBuZ3hfc3RyaW5nKCJpZiIpLAorICAgICAgTkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0NPTkZfQkxPQ0t8TkdYX0NPTkZfMU1PUkUsCisgICAgICBuZ3hfaHR0cF9yZXdyaXRlX2lmLAorICAgICAgTkdYX0hUVFBfTE9DX0NPTkZfT0ZGU0VULAorICAgICAgMCwKKyAgICAgIE5VTEwgfSwKKworICAgIHsgbmd4X3N0cmluZygidmFsaWRfcmVmZXJlcnMiKSwKKyAgICAgIE5HWF9IVFRQX1NSVl9DT05GfE5HWF9IVFRQX0xPQ19DT05GfE5HWF9DT05GXzFNT1JFLAorICAgICAgbmd4X2h0dHBfcmV3cml0ZV92YWxpZF9yZWZlcmVycywKKyAgICAgIE5HWF9IVFRQX0xPQ19DT05GX09GRlNFVCwKKyAgICAgIDAsCisgICAgICBOVUxMIH0sCiAKICAgICB7IG5neF9zdHJpbmcoInJld3JpdGVfbG9nIiksCi0gICAgICBOR1hfSFRUUF9TUlZfQ09ORnxOR1hfQ09ORl9UQUtFMSwKKyAgICAgIE5HWF9IVFRQX1NSVl9DT05GfE5HWF9IVFRQX1NJRl9DT05GfE5HWF9IVFRQX0xPQ19DT05GfE5HWF9IVFRQX0xJRl9DT05GCisgICAgICAgICAgICAgICAgICAgICAgIHxOR1hfQ09ORl9UQUtFMSwKICAgICAgIG5neF9jb25mX3NldF9mbGFnX3Nsb3QsCi0gICAgICBOR1hfSFRUUF9TUlZfQ09ORl9PRkZTRVQsCi0gICAgICBvZmZzZXRvZihuZ3hfaHR0cF9yZXdyaXRlX3Nydl9jb25mX3QsIGxvZyksCisgICAgICBOR1hfSFRUUF9MT0NfQ09ORl9PRkZTRVQsCisgICAgICBvZmZzZXRvZihuZ3hfaHR0cF9yZXdyaXRlX2xvY19jb25mX3QsIGxvZyksCiAgICAgICBOVUxMIH0sCiAKICAgICAgIG5neF9udWxsX2NvbW1hbmQKQEAgLTk0LDIxOSArMTg1LDQ3MCBAQAogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSBtYWluIGNvbmZpZ3VyYXRpb24gKi8KICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0IG1haW4gY29uZmlndXJhdGlvbiAqLwogCi0gICAgbmd4X2h0dHBfcmV3cml0ZV9jcmVhdGVfc3J2X2NvbmYsICAgICAgLyogY3JlYXRlIHNlcnZlciBjb25maWd1cmF0aW9uICovCi0gICAgbmd4X2h0dHBfcmV3cml0ZV9tZXJnZV9zcnZfY29uZiwgICAgICAgLyogbWVyZ2Ugc2VydmVyIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjcmVhdGUgc2VydmVyIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtZXJnZSBzZXJ2ZXIgY29uZmlndXJhdGlvbiAqLwogCiAgICAgbmd4X2h0dHBfcmV3cml0ZV9jcmVhdGVfbG9jX2NvbmYsICAgICAgLyogY3JlYXRlIGxvY2F0aW9uIGNvbmZpZ3JhdGlvbiAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1lcmdlIGxvY2F0aW9uIGNvbmZpZ3JhdGlvbiAqLworICAgIG5neF9odHRwX3Jld3JpdGVfbWVyZ2VfbG9jX2NvbmYgICAgICAgIC8qIG1lcmdlIGxvY2F0aW9uIGNvbmZpZ3JhdGlvbiAqLwogfTsKIAogCiBuZ3hfbW9kdWxlX3QgIG5neF9odHRwX3Jld3JpdGVfbW9kdWxlID0gewogICAgIE5HWF9NT0RVTEUsCi0gICAgJm5neF9odHRwX3Jld3JpdGVfbW9kdWxlX2N0eCwgICAgICAgICAgLyogbW9kdWxlIGNvbnRleHQgKi8KKyAgICAmbmd4X2h0dHBfcmV3cml0ZV9tb2R1bGVfY3R4LCAgICAgICAgICAvKiBtb2R1bGUgY29udGV4dCAqLyAKICAgICBuZ3hfaHR0cF9yZXdyaXRlX2NvbW1hbmRzLCAgICAgICAgICAgICAvKiBtb2R1bGUgZGlyZWN0aXZlcyAqLwogICAgIE5HWF9IVFRQX01PRFVMRSwgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vZHVsZSB0eXBlICovCiAgICAgbmd4X2h0dHBfcmV3cml0ZV9pbml0LCAgICAgICAgICAgICAgICAgLyogaW5pdCBtb2R1bGUgKi8KLSAgICBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0IGNoaWxkICovCisgICAgTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdCBwcm9jZXNzICovCiB9OwogCiAKKyNkZWZpbmUgbmd4X2h0dHBfcmV3cml0ZV9leGl0ICAodV9jaGFyICopICZuZ3hfaHR0cF9yZXdyaXRlX2V4aXRfY29kZQorCit1aW50cHRyX3Qgbmd4X2h0dHBfcmV3cml0ZV9leGl0X2NvZGUgPSAodWludHB0cl90KSBOVUxMOworCisKIHN0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfcmV3cml0ZV9oYW5kbGVyKG5neF9odHRwX3JlcXVlc3RfdCAqcikKIHsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICpjYXB0dXJlczsKLSAgICB1X2NoYXIgICAgICAgICAgICAgICAgICAgICAgICpwOwotICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgIGxlbjsKLSAgICB1aW50cHRyX3QgICAgICAgICAgICAgICAgICAgICBkYXRhOwotICAgIG5neF9pbnRfdCAgICAgICAgICAgICAgICAgICAgIHJjOwotICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICAgIGksIG0sIG47Ci0gICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgICAgdXJpLCBhcmdzOwotICAgIG5neF9odHRwX3Jld3JpdGVfb3BfdCAgICAgICAgKm9wOwotICAgIG5neF9odHRwX3Jld3JpdGVfcnVsZV90ICAgICAgKnJ1bGU7Ci0gICAgbmd4X2h0dHBfcmV3cml0ZV9zcnZfY29uZl90ICAqc2NmOworICAgIG5neF9odHRwX3Jld3JpdGVfY29kZV9wdCAgICAgIGNvZGU7CisgICAgbmd4X2h0dHBfcmV3cml0ZV9lbmdpbmVfdCAgICAqZTsKKyAgICBuZ3hfaHR0cF9yZXdyaXRlX2xvY19jb25mX3QgICpjZjsKIAotICAgIG5neF9sb2dfZGVidWcwKE5HWF9MT0dfREVCVUdfSFRUUCwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAotICAgICAgICAgICAgICAgICAgICJodHRwIHJld3JpdGUgaGFuZGxlciIpOworICAgIGNmID0gbmd4X2h0dHBfZ2V0X21vZHVsZV9sb2NfY29uZihyLCBuZ3hfaHR0cF9yZXdyaXRlX21vZHVsZSk7CiAKLSAgICBzY2YgPSBuZ3hfaHR0cF9nZXRfbW9kdWxlX3Nydl9jb25mKHIsIG5neF9odHRwX3Jld3JpdGVfbW9kdWxlKTsKLQotICAgIHJ1bGUgPSBzY2YtPnJ1bGVzLmVsdHM7Ci0gICAgZm9yIChpID0gMDsgaSA8IHNjZi0+cnVsZXMubmVsdHM7IGkrKykgewotCi0gICAgICAgIGlmIChydWxlW2ldLm5jYXB0dXJlcykgewotICAgICAgICAgICAgY2FwdHVyZXMgPSBuZ3hfcGFsbG9jKHItPnBvb2wsIHJ1bGVbaV0ubmNhcHR1cmVzICogc2l6ZW9mKGludCkpOwotICAgICAgICAgICAgaWYgKGNhcHR1cmVzID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjYXB0dXJlcyA9IE5VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICByYyA9IG5neF9yZWdleF9leGVjKHJ1bGVbaV0ucmVnZXgsICZyLT51cmksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwdHVyZXMsIHJ1bGVbaV0ubmNhcHR1cmVzKTsKLQotICAgICAgICBpZiAocmMgPT0gTkdYX1JFR0VYX05PX01BVENIRUQpIHsKLSAgICAgICAgICAgIGlmIChzY2YtPmxvZykgewotICAgICAgICAgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19OT1RJQ0UsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiVWXCIgZG9lcyBub3QgbWF0Y2ggXCIlVlwiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZydWxlW2ldLnJlX25hbWUsICZyLT51cmkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyYyA8IDApIHsKLSAgICAgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19BTEVSVCwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfcmVnZXhfZXhlY19uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIgZmFpbGVkOiAlZCBvbiBcIiVWXCIgdXNpbmcgXCIlVlwiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcmMsICZyLT51cmksICZydWxlW2ldLnJlX25hbWUpOwotICAgICAgICAgICAgcmV0dXJuIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzY2YtPmxvZykgewotICAgICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX05PVElDRSwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIlVlwiIG1hdGNoZXMgXCIlVlwiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJnJ1bGVbaV0ucmVfbmFtZSwgJnItPnVyaSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocnVsZVtpXS5zdGF0dXMpIHsKLSAgICAgICAgICAgIHJldHVybiBydWxlW2ldLnN0YXR1czsKLSAgICAgICAgfQotCi0gICAgICAgIHVyaS5sZW4gPSBydWxlW2ldLnNpemU7Ci0KLSAgICAgICAgZm9yIChuID0gMTsgbiA8IChuZ3hfdWludF90KSByYzsgbisrKSB7Ci0gICAgICAgICAgICB1cmkubGVuICs9IGNhcHR1cmVzWzIgKiBuICsgMV0gLSBjYXB0dXJlc1syICogbl07Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoISh1cmkuZGF0YSA9IG5neF9wYWxsb2Moci0+cG9vbCwgdXJpLmxlbikpKSB7Ci0gICAgICAgICAgICByZXR1cm4gTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICAgICAgYXJncy5kYXRhID0gTlVMTDsKLSAgICAgICAgcCA9IHVyaS5kYXRhOwotCi0gICAgICAgIG9wID0gcnVsZVtpXS5vcHMuZWx0czsKLSAgICAgICAgZm9yIChuID0gMDsgbiA8IHJ1bGVbaV0ub3BzLm5lbHRzOyBuKyspIHsKLSAgICAgICAgICAgIGlmIChvcFtuXS5vcCA9PSBOR1hfSFRUUF9SRVdSSVRFX0NPUFlfU0hPUlQpIHsKLSAgICAgICAgICAgICAgICBsZW4gPSBvcFtuXS5sZW47Ci0gICAgICAgICAgICAgICAgZGF0YSA9IG9wW25dLmRhdGE7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGxlbi0tKSB7Ci0gICAgICAgICAgICAgICAgICAgICpwKysgPSAoY2hhcikgKGRhdGEgJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgZGF0YSA+Pj0gODsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAob3Bbbl0ub3AgPT0gTkdYX0hUVFBfUkVXUklURV9DT1BZX0xPTkcpIHsKLSAgICAgICAgICAgICAgICBwID0gbmd4X2NweW1lbShwLCAodm9pZCAqKSBvcFtuXS5kYXRhLCBvcFtuXS5sZW4pOwotCi0gICAgICAgICAgICB9IGVsc2UgaWYgKG9wW25dLm9wID09IE5HWF9IVFRQX1JFV1JJVEVfU1RBUlRfQVJHUykgewotICAgICAgICAgICAgICAgIGFyZ3MuZGF0YSA9IHA7Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7IC8qIE5HWF9IVFRQX1JFV1JJVEVfQ09QWV9DQVBUVVJFICovCi0gICAgICAgICAgICAgICAgbSA9IDIgKiBvcFtuXS5kYXRhOwotICAgICAgICAgICAgICAgIHAgPSBuZ3hfY3B5bWVtKHAsICZyLT51cmkuZGF0YVtjYXB0dXJlc1ttXV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwdHVyZXNbbSArIDFdIC0gY2FwdHVyZXNbbV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGFyZ3MuZGF0YSkgewotICAgICAgICAgICAgdXJpLmxlbiA9IGFyZ3MuZGF0YSAtIHVyaS5kYXRhOwotICAgICAgICAgICAgYXJncy5sZW4gPSBwIC0gYXJncy5kYXRhOwotCi0gICAgICAgICAgICByLT5hcmdzID0gYXJnczsKLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdXJpLmxlbiA9IHAgLSB1cmkuZGF0YTsKLSAgICAgICAgICAgIGFyZ3MubGVuID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIHItPnVyaSA9IHVyaTsKLQotICAgICAgICBpZiAoc2NmLT5sb2cpIHsKLSAgICAgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19OT1RJQ0UsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgInJld3JpdHRlbiB1cmk6IFwiJVZcIiwgYXJnczogXCIlVlwiIiwgJnVyaSwgJmFyZ3MpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG5neF9odHRwX3NldF9leHRlbihyKSAhPSBOR1hfT0spIHsKLSAgICAgICAgICAgIHJldHVybiBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocnVsZVtpXS5sYXN0KSB7Ci0gICAgICAgICAgICByZXR1cm4gTkdYX0RFQ0xJTkVEOwotICAgICAgICB9CisgICAgaWYgKGNmLT5jb2RlcyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOR1hfREVDTElORUQ7CiAgICAgfQogCi0gICAgcmV0dXJuIE5HWF9ERUNMSU5FRDsKLX0KLQotCi1zdGF0aWMgbmd4X2ludF90IG5neF9odHRwX3JlZGlyZWN0X2hhbmRsZXIobmd4X2h0dHBfcmVxdWVzdF90ICpyKQotewotICAgIHVfY2hhciAgICAgICAgICAgICAgICAgICAgICAgKnA7Ci0gICAgbmd4X2h0dHBfcmV3cml0ZV9sb2NfY29uZl90ICAqcmxjZjsKLQotICAgIG5neF9sb2dfZGVidWcwKE5HWF9MT0dfREVCVUdfSFRUUCwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAotICAgICAgICAgICAgICAgICAgICJodHRwIHJlZGlyZWN0IGhhbmRsZXIiKTsKLQotICAgIHJsY2YgPSBuZ3hfaHR0cF9nZXRfbW9kdWxlX2xvY19jb25mKHIsIG5neF9odHRwX3Jld3JpdGVfbW9kdWxlKTsKLQotICAgIHItPmhlYWRlcnNfb3V0LmxvY2F0aW9uID0gbmd4X2xpc3RfcHVzaCgmci0+aGVhZGVyc19vdXQuaGVhZGVycyk7Ci0gICAgaWYgKHItPmhlYWRlcnNfb3V0LmxvY2F0aW9uID09IE5VTEwpIHsKKyAgICBpZiAoIShlID0gbmd4X3BhbGxvYyhyLT5wb29sLCBzaXplb2Yobmd4X2h0dHBfcmV3cml0ZV9lbmdpbmVfdCkpKSkgewogICAgICAgICByZXR1cm4gTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwogICAgIH0KIAotICAgIGlmIChybGNmLT5yZWRpcmVjdC5kYXRhWzBdICE9ICcvJykgeworICAgIGUtPnNwID0gbmd4X3BhbGxvYyhyLT5wb29sLCBjZi0+c3RhY2tfc2l6ZSAqIHNpemVvZihuZ3hfaW50X3QpKTsKKyAgICBpZiAoZS0+c3AgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOworICAgIH0KKworICAgIGlmIChjZi0+bWF4X2NhcHR1cmVzKSB7CisgICAgICAgIGUtPmNhcHR1cmVzID0gbmd4X3BhbGxvYyhyLT5wb29sLCBjZi0+bWF4X2NhcHR1cmVzICogc2l6ZW9mKGludCkpOworICAgICAgICBpZiAoZS0+Y2FwdHVyZXMgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKKyAgICAgICAgfQorCisgICAgfSBlbHNlIHsKKyAgICAgICAgZS0+Y2FwdHVyZXMgPSBOVUxMOworICAgIH0KKworICAgIGUtPmlwID0gY2YtPmNvZGVzLT5lbHRzOworICAgIGUtPmJ1Zi5sZW4gPSAwOworICAgIGUtPmJ1Zi5kYXRhID0gTlVMTDsKKyAgICBlLT5saW5lID0gTlVMTDsKKyAgICBlLT5wb3MgPSBOVUxMOworICAgIGUtPmFyZ3MgPSBOVUxMOworICAgIGUtPnF1b3RlID0gMTsKKyAgICBlLT5zdGF0dXMgPSBOR1hfREVDTElORUQ7CisgICAgZS0+cmVxdWVzdCA9IHI7CisgICAgZS0+Y29uZiA9IGNmOworCisgICAgd2hpbGUgKCoodWludHB0cl90ICopIGUtPmlwKSB7CisgICAgICAgIGNvZGUgPSAqKG5neF9odHRwX3Jld3JpdGVfY29kZV9wdCAqKSBlLT5pcDsKKyAgICAgICAgY29kZShlKTsKKyAgICB9CisKKyAgICByZXR1cm4gZS0+c3RhdHVzOworfQorCisKK3N0YXRpYyB2b2lkIG5neF9odHRwX3Jld3JpdGVfcmVnZXhfc3RhcnRfY29kZShuZ3hfaHR0cF9yZXdyaXRlX2VuZ2luZV90ICplKQoreworICAgIG5neF9pbnRfdCAgICAgICAgICAgICAgICAgICAgICAgcmM7CisgICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgICAgICBuOworICAgIG5neF9odHRwX3JlcXVlc3RfdCAgICAgICAgICAgICAqcjsKKyAgICBuZ3hfaHR0cF9yZXdyaXRlX3JlZ2V4X2NvZGVfdCAgKmNvZGU7CisKKyAgICBjb2RlID0gKG5neF9odHRwX3Jld3JpdGVfcmVnZXhfY29kZV90ICopIGUtPmlwOworCisgICAgciA9IGUtPnJlcXVlc3Q7CisKKyAgICBuZ3hfbG9nX2RlYnVnMShOR1hfTE9HX0RFQlVHX0hUVFAsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAiaHR0cCByZXdyaXRlIHN0YXJ0OiBcIiVWXCIiLCAmY29kZS0+bmFtZSk7CisKKyAgICBpZiAoY29kZS0+dXJpKSB7CisgICAgICAgIGUtPmxpbmUgPSAmci0+dXJpOworICAgIH0gZWxzZSB7CisgICAgICAgIGUtPmxpbmUgPSAqKG5neF9zdHJfdCAqKikgZS0+c3AtLTsKKyAgICB9CisKKyAgICByYyA9IG5neF9yZWdleF9leGVjKGNvZGUtPnJlZ2V4LCBlLT5saW5lLCBlLT5jYXB0dXJlcywgY29kZS0+bmNhcHR1cmVzKTsKKworICAgIGlmIChyYyA9PSBOR1hfUkVHRVhfTk9fTUFUQ0hFRCkgeworICAgICAgICBpZiAoZS0+Y29uZi0+bG9nKSB7CisgICAgICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfTk9USUNFLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiVWXCIgZG9lcyBub3QgbWF0Y2ggXCIlVlwiIiwgJmNvZGUtPm5hbWUsIGUtPmxpbmUpOworICAgICAgICB9CisKKyAgICAgICAgZS0+aXAgKz0gY29kZS0+bmV4dDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0FMRVJULCByLT5jb25uZWN0aW9uLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgICAgbmd4X3JlZ2V4X2V4ZWNfbiAiIGZhaWxlZDogJWQgb24gXCIlVlwiIHVzaW5nIFwiJVZcIiIsCisgICAgICAgICAgICAgICAgICAgICAgcmMsIGUtPmxpbmUsICZjb2RlLT5uYW1lKTsKKworICAgICAgICBlLT5pcCA9IG5neF9odHRwX3Jld3JpdGVfZXhpdDsKKyAgICAgICAgZS0+c3RhdHVzID0gTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGUtPmNvbmYtPmxvZykgeworICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfTk9USUNFLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgICAgIlwiJVZcIiBtYXRjaGVzIFwiJVZcIiIsICZjb2RlLT5uYW1lLCBlLT5saW5lKTsKKyAgICB9CisKKyAgICBpZiAoY29kZS0+c3RhdHVzKSB7CisgICAgICAgIGUtPnN0YXR1cyA9IGNvZGUtPnN0YXR1czsKKworICAgICAgICBpZiAoIWNvZGUtPnJlZGlyZWN0KSB7CisgICAgICAgICAgICBlLT5pcCA9IG5neF9odHRwX3Jld3JpdGVfZXhpdDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGUtPmJ1Zi5sZW4gPSBjb2RlLT5zaXplOworCisgICAgaWYgKGNvZGUtPnVyaSkgeworICAgICAgICByLT51cmlfY2hhbmdlZCA9IDE7CisKKyAgICAgICAgaWYgKHJjICYmIChyLT5xdW90ZWRfdXJpIHx8IHItPnBsdXNfaW5fdXJpKSkgeworICAgICAgICAgICAgZS0+YnVmLmxlbiArPSAyICogbmd4X2VzY2FwZV91cmkoTlVMTCwgci0+dXJpLmRhdGEsIHItPnVyaS5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR1hfRVNDQVBFX0FSR1MpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChuID0gMTsgbiA8IChuZ3hfdWludF90KSByYzsgbisrKSB7CisgICAgICAgIGUtPmJ1Zi5sZW4gKz0gZS0+Y2FwdHVyZXNbMiAqIG4gKyAxXSAtIGUtPmNhcHR1cmVzWzIgKiBuXTsKKyAgICB9CisKKyAgICBpZiAoY29kZS0+YXJncyAmJiByLT5hcmdzLmxlbikgeworICAgICAgICBlLT5idWYubGVuICs9IHItPmFyZ3MubGVuICsgMTsKKyAgICB9CisKKyAgICBpZiAoIShlLT5idWYuZGF0YSA9IG5neF9wYWxsb2Moci0+cG9vbCwgZS0+YnVmLmxlbikpKSB7CisgICAgICAgIGUtPmlwID0gbmd4X2h0dHBfcmV3cml0ZV9leGl0OworICAgICAgICBlLT5zdGF0dXMgPSBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBlLT5xdW90ZSA9IGNvZGUtPnJlZGlyZWN0OworCisgICAgZS0+cG9zID0gZS0+YnVmLmRhdGE7CisKKyAgICBlLT5pcCArPSBzaXplb2Yobmd4X2h0dHBfcmV3cml0ZV9yZWdleF9jb2RlX3QpOworfQorCisKK3N0YXRpYyB2b2lkIG5neF9odHRwX3Jld3JpdGVfcmVnZXhfZW5kX2NvZGUobmd4X2h0dHBfcmV3cml0ZV9lbmdpbmVfdCAqZSkKK3sKKyAgICBuZ3hfaHR0cF9yZXF1ZXN0X3QgICAgICAgICAgICAgICAgICpyOworICAgIG5neF9odHRwX3Jld3JpdGVfcmVnZXhfZW5kX2NvZGVfdCAgKmNvZGU7CisKKyAgICBjb2RlID0gKG5neF9odHRwX3Jld3JpdGVfcmVnZXhfZW5kX2NvZGVfdCAqKSBlLT5pcDsKKworICAgIHIgPSBlLT5yZXF1ZXN0OworCisgICAgZS0+cXVvdGUgPSAwOworCisgICAgbmd4X2xvZ19kZWJ1ZzAoTkdYX0xPR19ERUJVR19IVFRQLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgImh0dHAgcmV3cml0ZSBlbmQiKTsKKworICAgIGlmIChlLT5hcmdzKSB7CisgICAgICAgIGUtPmJ1Zi5sZW4gPSBlLT5hcmdzIC0gZS0+YnVmLmRhdGE7CisKKyAgICAgICAgaWYgKGNvZGUtPmFyZ3MgJiYgci0+YXJncy5sZW4pIHsKKyAgICAgICAgICAgICplLT5wb3MrKyA9ICcmJzsKKyAgICAgICAgICAgIGUtPnBvcyA9IG5neF9jcHltZW0oZS0+cG9zLCByLT5hcmdzLmRhdGEsIHItPmFyZ3MubGVuKTsKKyAgICAgICAgfQorCisgICAgICAgIHItPmFyZ3MubGVuID0gZS0+cG9zIC0gZS0+YXJnczsKKyAgICAgICAgci0+YXJncy5kYXRhID0gZS0+YXJnczsKKworICAgICAgICBlLT5hcmdzID0gTlVMTDsKKworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChjb2RlLT5hcmdzICYmIHItPmFyZ3MubGVuKSB7CisgICAgICAgICAgICAqZS0+cG9zKysgPSAnJic7CisgICAgICAgICAgICBlLT5wb3MgPSBuZ3hfY3B5bWVtKGUtPnBvcywgci0+YXJncy5kYXRhLCByLT5hcmdzLmxlbik7CisgICAgICAgIH0KKworICAgICAgICBlLT5idWYubGVuID0gZS0+cG9zIC0gZS0+YnVmLmRhdGE7CisgICAgfQorCisgICAgaWYgKCFjb2RlLT5yZWRpcmVjdCkgeworICAgICAgICBpZiAoZS0+Y29uZi0+bG9nKSB7CisgICAgICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfTk9USUNFLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXdyaXR0ZW4gZGF0YTogXCIlVlwiLCBhcmdzOiBcIiVWXCIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZS0+YnVmLCAmci0+YXJncyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29kZS0+dXJpKSB7CisgICAgICAgICAgICByLT51cmkgPSBlLT5idWY7CisKKyAgICAgICAgICAgIGlmIChuZ3hfaHR0cF9zZXRfZXh0ZW4ocikgIT0gTkdYX09LKSB7CisgICAgICAgICAgICAgICAgZS0+aXAgPSBuZ3hfaHR0cF9yZXdyaXRlX2V4aXQ7CisgICAgICAgICAgICAgICAgZS0+c3RhdHVzID0gTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGUtPmlwICs9IHNpemVvZihuZ3hfaHR0cF9yZXdyaXRlX3JlZ2V4X2VuZF9jb2RlX3QpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX05PVElDRSwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgInJld3JpdHRlbiByZWRpcmVjdDogXCIlVlwiIiwgJmUtPmJ1Zik7CisKKyAgICBpZiAoIShyLT5oZWFkZXJzX291dC5sb2NhdGlvbiA9IG5neF9saXN0X3B1c2goJnItPmhlYWRlcnNfb3V0LmhlYWRlcnMpKSkgeworICAgICAgICBlLT5pcCA9IG5neF9odHRwX3Jld3JpdGVfZXhpdDsKKyAgICAgICAgZS0+c3RhdHVzID0gTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGUtPmJ1Zi5kYXRhWzBdICE9ICcvJykgewogICAgICAgICByLT5oZWFkZXJzX291dC5sb2NhdGlvbi0+a2V5LmxlbiA9IHNpemVvZigiTG9jYXRpb24iKSAtIDE7CiAgICAgICAgIHItPmhlYWRlcnNfb3V0LmxvY2F0aW9uLT5rZXkuZGF0YSA9ICh1X2NoYXIgKikgIkxvY2F0aW9uIjsKICAgICB9CiAKLSAgICByLT5oZWFkZXJzX291dC5sb2NhdGlvbi0+dmFsdWUubGVuID0gIHJsY2YtPnJlZGlyZWN0LmxlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyByLT51bnBhcnNlZF91cmkubGVuOwotICAgIHItPmhlYWRlcnNfb3V0LmxvY2F0aW9uLT52YWx1ZS5kYXRhID0gbmd4X3BhbGxvYyhyLT5wb29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHItPmhlYWRlcnNfb3V0LmxvY2F0aW9uLT52YWx1ZS5sZW4pOworICAgIHItPmhlYWRlcnNfb3V0LmxvY2F0aW9uLT52YWx1ZSA9IGUtPmJ1ZjsKIAotICAgIGlmIChyLT5oZWFkZXJzX291dC5sb2NhdGlvbi0+dmFsdWUuZGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7CisgICAgZS0+aXAgKz0gc2l6ZW9mKG5neF9odHRwX3Jld3JpdGVfcmVnZXhfZW5kX2NvZGVfdCk7Cit9CisKKworc3RhdGljIHZvaWQgbmd4X2h0dHBfcmV3cml0ZV9jb3B5X2NhcHR1cmVfY29kZShuZ3hfaHR0cF9yZXdyaXRlX2VuZ2luZV90ICplKQoreworICAgIG5neF9odHRwX3Jld3JpdGVfY29weV9jYXB0dXJlX2NvZGVfdCAgKmNvZGU7CisKKyAgICBjb2RlID0gKG5neF9odHRwX3Jld3JpdGVfY29weV9jYXB0dXJlX2NvZGVfdCAqKSBlLT5pcDsKKworICAgIGUtPmlwICs9IHNpemVvZihuZ3hfaHR0cF9yZXdyaXRlX2NvcHlfY2FwdHVyZV9jb2RlX3QpOworCisgICAgaWYgKChlLT5hcmdzIHx8IGUtPnF1b3RlKQorICAgICAgICAmJiAoZS0+cmVxdWVzdC0+cXVvdGVkX3VyaSB8fCBlLT5yZXF1ZXN0LT5wbHVzX2luX3VyaSkpCisgICAgeworICAgICAgICBlLT5wb3MgPSAodV9jaGFyICopIG5neF9lc2NhcGVfdXJpKGUtPnBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmUtPmxpbmUtPmRhdGFbZS0+Y2FwdHVyZXNbY29kZS0+bl1dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLT5jYXB0dXJlc1tjb2RlLT5uICsgMV0gLSBlLT5jYXB0dXJlc1tjb2RlLT5uXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdYX0VTQ0FQRV9BUkdTKTsKKyAgICB9IGVsc2UgeworICAgICAgICBlLT5wb3MgPSBuZ3hfY3B5bWVtKGUtPnBvcywgJmUtPmxpbmUtPmRhdGFbZS0+Y2FwdHVyZXNbY29kZS0+bl1dLAorICAgICAgICAgICAgICAgICAgICAgICAgZS0+Y2FwdHVyZXNbY29kZS0+biArIDFdIC0gZS0+Y2FwdHVyZXNbY29kZS0+bl0pOwogICAgIH0KIAotICAgIHAgPSBuZ3hfY3B5bWVtKHItPmhlYWRlcnNfb3V0LmxvY2F0aW9uLT52YWx1ZS5kYXRhLCBybGNmLT5yZWRpcmVjdC5kYXRhLAotICAgICAgICAgICAgICAgICAgIHJsY2YtPnJlZGlyZWN0Lmxlbik7Ci0gICAgcCA9IG5neF9jcHlzdHJuKHAsIHItPnVucGFyc2VkX3VyaS5kYXRhICsgMSwgci0+dW5wYXJzZWRfdXJpLmxlbik7Ci0KLSAgICByZXR1cm4gTkdYX0hUVFBfTU9WRURfVEVNUE9SQVJJTFk7CisgICAgbmd4X2xvZ19kZWJ1ZzEoTkdYX0xPR19ERUJVR19IVFRQLCBlLT5yZXF1ZXN0LT5jb25uZWN0aW9uLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgImh0dHAgcmV3cml0ZSBjYXB0dXJlOiBcIiVWXCIiLCAmZS0+YnVmKTsKIH0KIAogCi1zdGF0aWMgdm9pZCAqbmd4X2h0dHBfcmV3cml0ZV9jcmVhdGVfc3J2X2NvbmYobmd4X2NvbmZfdCAqY2YpCitzdGF0aWMgdm9pZCBuZ3hfaHR0cF9yZXdyaXRlX2NvcHlfY29kZShuZ3hfaHR0cF9yZXdyaXRlX2VuZ2luZV90ICplKQogewotICAgIG5neF9odHRwX3Jld3JpdGVfc3J2X2NvbmZfdCAgKmNvbmY7CisgICAgbmd4X2h0dHBfcmV3cml0ZV9jb3B5X2NvZGVfdCAgKmNvZGU7CiAKLSAgICBpZiAoIShjb25mID0gbmd4X3BhbGxvYyhjZi0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX3Jld3JpdGVfc3J2X2NvbmZfdCkpKSkgewotICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgY29kZSA9IChuZ3hfaHR0cF9yZXdyaXRlX2NvcHlfY29kZV90ICopIGUtPmlwOworCisgICAgZS0+cG9zID0gbmd4X2NweW1lbShlLT5wb3MsIGUtPmlwICsgc2l6ZW9mKG5neF9odHRwX3Jld3JpdGVfY29weV9jb2RlX3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgY29kZS0+bGVuKTsKKworICAgIGUtPmlwICs9IHNpemVvZihuZ3hfaHR0cF9yZXdyaXRlX2NvcHlfY29kZV90KQorICAgICAgICAgICAgICsgKChjb2RlLT5sZW4gKyBzaXplb2YodWludHB0cl90KSAtIDEpICYgfihzaXplb2YodWludHB0cl90KSAtIDEpKTsKKworICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfSFRUUCwgZS0+cmVxdWVzdC0+Y29ubmVjdGlvbi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICJodHRwIHJld3JpdGUgY29weTogXCIlVlwiIiwgJmUtPmJ1Zik7Cit9CisKKworc3RhdGljIHZvaWQgbmd4X2h0dHBfcmV3cml0ZV9zdGFydF9hcmdzX2NvZGUobmd4X2h0dHBfcmV3cml0ZV9lbmdpbmVfdCAqZSkKK3sKKyAgICBuZ3hfbG9nX2RlYnVnMChOR1hfTE9HX0RFQlVHX0hUVFAsIGUtPnJlcXVlc3QtPmNvbm5lY3Rpb24tPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAiaHR0cCByZXdyaXRlIGFyZ3MiKTsKKworICAgIGUtPmFyZ3MgPSBlLT5wb3M7CisgICAgZS0+aXAgKz0gc2l6ZW9mKHVpbnRwdHJfdCk7Cit9CisKKworc3RhdGljIHZvaWQgbmd4X2h0dHBfcmV3cml0ZV9yZXR1cm5fY29kZShuZ3hfaHR0cF9yZXdyaXRlX2VuZ2luZV90ICplKQoreworICAgIG5neF9odHRwX3Jld3JpdGVfcmV0dXJuX2NvZGVfdCAgKmNvZGU7CisKKyAgICBjb2RlID0gKG5neF9odHRwX3Jld3JpdGVfcmV0dXJuX2NvZGVfdCAqKSBlLT5pcDsKKworICAgIGUtPnN0YXR1cyA9IGNvZGUtPnN0YXR1czsKKworICAgIGUtPmlwICs9IHNpemVvZihuZ3hfaHR0cF9yZXdyaXRlX3JldHVybl9jb2RlX3QpIC0gc2l6ZW9mKHVpbnRwdHJfdCk7Cit9CisKKworc3RhdGljIHZvaWQgbmd4X2h0dHBfcmV3cml0ZV9pZl9jb2RlKG5neF9odHRwX3Jld3JpdGVfZW5naW5lX3QgKmUpCit7CisgICAgbmd4X2h0dHBfcmV3cml0ZV9pZl9jb2RlX3QgICpjb2RlOworCisgICAgY29kZSA9IChuZ3hfaHR0cF9yZXdyaXRlX2lmX2NvZGVfdCAqKSBlLT5pcDsKKworICAgIG5neF9sb2dfZGVidWcwKE5HWF9MT0dfREVCVUdfSFRUUCwgZS0+cmVxdWVzdC0+Y29ubmVjdGlvbi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICJodHRwIHJld3JpdGUgaWYiKTsKKworICAgIGlmICgqZS0+c3AtLSkgeworICAgICAgICBpZiAoY29kZS0+bG9jX2NvbmYpIHsKKyAgICAgICAgICAgIGUtPnJlcXVlc3QtPmxvY19jb25mID0gY29kZS0+bG9jX2NvbmY7CisgICAgICAgIH0KKworICAgICAgICBlLT5pcCArPSBzaXplb2Yobmd4X2h0dHBfcmV3cml0ZV9pZl9jb2RlX3QpOworICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgbmd4X2luaXRfYXJyYXkoY29uZi0+cnVsZXMsIGNmLT5wb29sLCA1LCBzaXplb2Yobmd4X2h0dHBfcmV3cml0ZV9ydWxlX3QpLAotICAgICAgICAgICAgICAgICAgIE5HWF9DT05GX0VSUk9SKTsKKyAgICBuZ3hfbG9nX2RlYnVnMChOR1hfTE9HX0RFQlVHX0hUVFAsIGUtPnJlcXVlc3QtPmNvbm5lY3Rpb24tPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAiaHR0cCByZXdyaXRlIGlmIGZhbHNlIik7CiAKLSAgICBjb25mLT5sb2cgPSBOR1hfQ09ORl9VTlNFVDsKLQotICAgIHJldHVybiBjb25mOworICAgIGUtPmlwICs9IGNvZGUtPm5leHQ7CiB9CiAKIAotc3RhdGljIGNoYXIgKm5neF9odHRwX3Jld3JpdGVfbWVyZ2Vfc3J2X2NvbmYobmd4X2NvbmZfdCAqY2YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwYXJlbnQsIHZvaWQgKmNoaWxkKQorc3RhdGljIHZvaWQgbmd4X2h0dHBfcmV3cml0ZV92YXJfY29kZShuZ3hfaHR0cF9yZXdyaXRlX2VuZ2luZV90ICplKQogewotICAgIG5neF9odHRwX3Jld3JpdGVfc3J2X2NvbmZfdCAqcHJldiA9IHBhcmVudDsKLSAgICBuZ3hfaHR0cF9yZXdyaXRlX3Nydl9jb25mX3QgKmNvbmYgPSBjaGlsZDsKKyAgICBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICAgICp2YWx1ZTsKKyAgICBuZ3hfaHR0cF9yZXdyaXRlX3Zhcl9jb2RlX3QgICpjb2RlOwogCi0gICAgbmd4X2NvbmZfbWVyZ2VfdmFsdWUoY29uZi0+bG9nLCBwcmV2LT5sb2csIDApOworICAgIG5neF9sb2dfZGVidWcwKE5HWF9MT0dfREVCVUdfSFRUUCwgZS0+cmVxdWVzdC0+Y29ubmVjdGlvbi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICJodHRwIHJld3JpdGUgdmFyIik7CiAKLSAgICByZXR1cm4gTkdYX0NPTkZfT0s7CisgICAgY29kZSA9IChuZ3hfaHR0cF9yZXdyaXRlX3Zhcl9jb2RlX3QgKikgZS0+aXA7CisKKyAgICBlLT5zcCsrOworCisgICAgZS0+aXAgKz0gc2l6ZW9mKG5neF9odHRwX3Jld3JpdGVfdmFyX2NvZGVfdCk7CisKKyAgICBpZiAoISh2YWx1ZSA9IG5neF9odHRwX2dldF92YXJpYWJsZShlLT5yZXF1ZXN0LCBjb2RlLT5pbmRleCkpKSB7CisgICAgICAgICplLT5zcCA9ICh1aW50cHRyX3QpIDA7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBuZ3hfbG9nX2RlYnVnMShOR1hfTE9HX0RFQlVHX0hUVFAsIGUtPnJlcXVlc3QtPmNvbm5lY3Rpb24tPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAiaHR0cCByZXdyaXRlIHZhcjogJXAiLCB2YWx1ZS0+dmFsdWUpOworCisgICAgKmUtPnNwID0gdmFsdWUtPnZhbHVlOwogfQogCiAKK3N0YXRpYyB2b2lkIG5neF9odHRwX3Jld3JpdGVfaW52YWxpZF9yZWZlcmVyX2NvZGUobmd4X2h0dHBfcmV3cml0ZV9lbmdpbmVfdCAqZSkKK3sKKyAgICB1X2NoYXIgICAgICAgICAgICAgICAgICAgICAgICpyZWY7CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgbGVuOworICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICAgIGksIG47CisgICAgbmd4X2h0dHBfcmVxdWVzdF90ICAgICAgICAgICAqcjsKKyAgICBuZ3hfaHR0cF9yZXdyaXRlX3JlZmVyZXJfdCAgICpyZWZzOworICAgIG5neF9odHRwX3Jld3JpdGVfbG9jX2NvbmZfdCAgKmNmOworCisgICAgciA9IGUtPnJlcXVlc3Q7CisKKyAgICBuZ3hfbG9nX2RlYnVnMChOR1hfTE9HX0RFQlVHX0hUVFAsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAiaHR0cCByZXdyaXRlIGludmFsaWQgcmVmZXJlciIpOworCisgICAgY2YgPSBuZ3hfaHR0cF9nZXRfbW9kdWxlX2xvY19jb25mKHIsIG5neF9odHRwX3Jld3JpdGVfbW9kdWxlKTsKKworICAgIGUtPnNwKys7CisgICAgZS0+aXAgKz0gc2l6ZW9mKHVpbnRwdHJfdCk7CisKKyAgICBpZiAoY2YtPnJlZmVyZXJzID09IE5VTEwpIHsKKyAgICAgICAgKmUtPnNwID0gKHVpbnRwdHJfdCkgMDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChyLT5oZWFkZXJzX2luLnJlZmVyZXIgPT0gTlVMTCkgeworICAgICAgICBpZiAoY2YtPm5vX3JlZmVyZXIpIHsKKyAgICAgICAgICAgICplLT5zcCA9ICh1aW50cHRyX3QpIDA7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqZS0+c3AgPSAodWludHB0cl90KSAxOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgbGVuID0gci0+aGVhZGVyc19pbi5yZWZlcmVyLT52YWx1ZS5sZW47CisgICAgcmVmID0gci0+aGVhZGVyc19pbi5yZWZlcmVyLT52YWx1ZS5kYXRhOworCisgICAgaWYgKGxlbiA8IHNpemVvZigiaHR0cDovL2kucnUiKSAtIDEKKyAgICAgICAgfHwgKG5neF9zdHJuY2FzZWNtcChyZWYsICJodHRwOi8vIiwgNykgIT0gMCkpCisgICAgeworICAgICAgICAqZS0+c3AgPSAodWludHB0cl90KSAxOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbGVuIC09IDc7CisgICAgcmVmICs9IDc7CisKKyAgICByZWZzID0gY2YtPnJlZmVyZXJzLT5lbHRzOworICAgIGZvciAoaSA9IDA7IGkgPCBjZi0+cmVmZXJlcnMtPm5lbHRzOyBpKysgKXsKKworICAgICAgICBpZiAocmVmc1tpXS5uYW1lLmxlbiA+IGxlbikgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVmc1tpXS53aWxkY2FyZCkgeworICAgICAgICAgICAgZm9yIChuID0gMDsgbiA8IGxlbjsgbisrKSB7CisgICAgICAgICAgICAgICAgaWYgKHJlZltuXSA9PSAnLycgfHwgcmVmW25dID09ICc6JykgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAocmVmW25dICE9ICcuJykgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobmd4X3N0cm5jbXAoJnJlZltuXSwgcmVmc1tpXS5uYW1lLmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnNbaV0ubmFtZS5sZW4pID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAqZS0+c3AgPSAodWludHB0cl90KSAwOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAobmd4X3N0cm5jYXNlY21wKHJlZnNbaV0ubmFtZS5kYXRhLCByZWYsIHJlZnNbaV0ubmFtZS5sZW4pID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKmUtPnNwID0gKHVpbnRwdHJfdCkgMDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqZS0+c3AgPSAodWludHB0cl90KSAxOworfQorCisKK3N0YXRpYyB2b2lkIG5neF9odHRwX3Jld3JpdGVfbm9wX2NvZGUobmd4X2h0dHBfcmV3cml0ZV9lbmdpbmVfdCAqZSkKK3sKKyAgICBlLT5pcCArPSBzaXplb2YodWludHB0cl90KTsKK30KKworCitzdGF0aWMgbmd4X2ludF90IG5neF9odHRwX3Jld3JpdGVfaW5pdChuZ3hfY3ljbGVfdCAqY3ljbGUpCit7ICAgCisgICAgbmd4X2h0dHBfaGFuZGxlcl9wdCAgICAgICAgKmg7CisgICAgbmd4X2h0dHBfY29yZV9tYWluX2NvbmZfdCAgKmNtY2Y7CisgICAgCisgICAgY21jZiA9IG5neF9odHRwX2N5Y2xlX2dldF9tb2R1bGVfbWFpbl9jb25mKGN5Y2xlLCBuZ3hfaHR0cF9jb3JlX21vZHVsZSk7CisKKyAgICBoID0gbmd4X3B1c2hfYXJyYXkoJmNtY2YtPnBoYXNlc1tOR1hfSFRUUF9SRVdSSVRFX1BIQVNFXS5oYW5kbGVycyk7CisgICAgaWYgKGggPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgIH0KKyAgICAKKyAgICAqaCA9IG5neF9odHRwX3Jld3JpdGVfaGFuZGxlcjsKKyAgICAKKyAgICByZXR1cm4gTkdYX09LOworfSAgIAorCisKIHN0YXRpYyB2b2lkICpuZ3hfaHR0cF9yZXdyaXRlX2NyZWF0ZV9sb2NfY29uZihuZ3hfY29uZl90ICpjZikKIHsKICAgICBuZ3hfaHR0cF9yZXdyaXRlX2xvY19jb25mX3QgICpjb25mOwpAQCAtMzE1LDE5OCArNjU3LDY0MyBAQAogICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgfQogCisgICAgY29uZi0+c3RhY2tfc2l6ZSA9IE5HWF9DT05GX1VOU0VUX1VJTlQ7CisgICAgY29uZi0+bG9nID0gTkdYX0NPTkZfVU5TRVQ7CisgICAgY29uZi0+bm9fcmVmZXJlciA9IE5HWF9DT05GX1VOU0VUOworCiAgICAgcmV0dXJuIGNvbmY7CiB9CiAKIAotc3RhdGljIGNoYXIgKm5neF9odHRwX3Jld3JpdGVfcnVsZShuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjb25mKQorc3RhdGljIGNoYXIgKm5neF9odHRwX3Jld3JpdGVfbWVyZ2VfbG9jX2NvbmYobmd4X2NvbmZfdCAqY2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwYXJlbnQsIHZvaWQgKmNoaWxkKQogewotICAgIG5neF9odHRwX3Jld3JpdGVfc3J2X2NvbmZfdCAqc2NmID0gY29uZjsKKyAgICBuZ3hfaHR0cF9yZXdyaXRlX2xvY19jb25mX3QgKnByZXYgPSBwYXJlbnQ7CisgICAgbmd4X2h0dHBfcmV3cml0ZV9sb2NfY29uZl90ICpjb25mID0gY2hpbGQ7CiAKLSAgICB1X2NoYXIgICAgICAgICAgICAgICAgICAgKmRhdGEsICpwOwotICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgbGVuOwotICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAqdmFsdWUsIGVycjsKLSAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgIGksIG47Ci0gICAgbmd4X2h0dHBfcmV3cml0ZV9vcF90ICAgICpvcDsKLSAgICBuZ3hfaHR0cF9yZXdyaXRlX3J1bGVfdCAgKnJ1bGU7Ci0gICAgdV9jaGFyICAgICAgICAgICAgICAgICAgICBlcnJzdHJbTkdYX01BWF9DT05GX0VSUlNUUl07CisgICAgdWludHB0cl90ICAgICAgICAgICAgICAgICAgICAgICpjb2RlLCAqbGFzdDsKKyAgICBuZ3hfaHR0cF9yZXdyaXRlX3JlZ2V4X2NvZGVfdCAgKnJlZ2V4OwogCi0gICAgaWYgKCEocnVsZSA9IG5neF9wdXNoX2FycmF5KCZzY2YtPnJ1bGVzKSkpIHsKKyAgICBuZ3hfY29uZl9tZXJnZV92YWx1ZShjb25mLT5sb2csIHByZXYtPmxvZywgMCk7CisgICAgbmd4X2NvbmZfbWVyZ2VfdW5zaWduZWRfdmFsdWUoY29uZi0+c3RhY2tfc2l6ZSwgcHJldi0+c3RhY2tfc2l6ZSwgMTApOworCisgICAgaWYgKGNvbmYtPnJlZmVyZXJzID09IE5VTEwpIHsKKyAgICAgICAgY29uZi0+cmVmZXJlcnMgPSBwcmV2LT5yZWZlcmVyczsKKyAgICAgICAgbmd4X2NvbmZfbWVyZ2VfdmFsdWUoY29uZi0+bm9fcmVmZXJlciwgcHJldi0+bm9fcmVmZXJlciwgMCk7CisgICAgfQorCisgICAgaWYgKGNvbmYtPmNvZGVzID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5HWF9DT05GX09LOworICAgIH0KKworICAgIGlmIChjb25mLT5jb2RlcyA9PSBwcmV2LT5jb2RlcykgeworICAgICAgICByZXR1cm4gTkdYX0NPTkZfT0s7CisgICAgfQorCisgICAgY29kZSA9IGNvbmYtPmNvZGVzLT5lbHRzOworICAgIGxhc3QgPSAodWludHB0cl90ICopICgodV9jaGFyICopIGNvZGUgKyBjb25mLT5jb2Rlcy0+bmVsdHMpOworCisgICAgd2hpbGUgKGNvZGUgPCBsYXN0KSB7CisgICAgICAgIGlmICgqY29kZSA9PSAodWludHB0cl90KSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfT0s7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKmNvZGUgPT0gKHVpbnRwdHJfdCkgJm5neF9odHRwX3Jld3JpdGVfcmVnZXhfc3RhcnRfY29kZSkgeworICAgICAgICAgICAgcmVnZXggPSAobmd4X2h0dHBfcmV3cml0ZV9yZWdleF9jb2RlX3QgKikgY29kZTsKKyAgICAgICAgICAgIGlmIChjb25mLT5tYXhfY2FwdHVyZXMgPCByZWdleC0+bmNhcHR1cmVzKSB7CisgICAgICAgICAgICAgICAgY29uZi0+bWF4X2NhcHR1cmVzID0gcmVnZXgtPm5jYXB0dXJlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvZGUgPSAodWludHB0cl90ICopICgodV9jaGFyICopIGNvZGUgKyByZWdleC0+bmV4dCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKmNvZGUgPT0gKHVpbnRwdHJfdCkgJm5neF9odHRwX3Jld3JpdGVfaWZfY29kZSkgeworICAgICAgICAgICAgY29kZSArPSBzaXplb2Yobmd4X2h0dHBfcmV3cml0ZV9pZl9jb2RlX3QpIC8gc2l6ZW9mKHVpbnRwdHJfdCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKmNvZGUgPT0gKHVpbnRwdHJfdCkgJm5neF9odHRwX3Jld3JpdGVfcmV0dXJuX2NvZGUpIHsKKyAgICAgICAgICAgIGNvZGUgKz0gc2l6ZW9mKG5neF9odHRwX3Jld3JpdGVfcmV0dXJuX2NvZGVfdCkgLyBzaXplb2YodWludHB0cl90KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgqY29kZSA9PSAodWludHB0cl90KSAmbmd4X2h0dHBfcmV3cml0ZV92YXJfY29kZSkgeworICAgICAgICAgICAgY29kZSArPSBzaXplb2Yobmd4X2h0dHBfcmV3cml0ZV92YXJfY29kZV90KSAvIHNpemVvZih1aW50cHRyX3QpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCpjb2RlID09ICh1aW50cHRyX3QpICZuZ3hfaHR0cF9yZXdyaXRlX2ludmFsaWRfcmVmZXJlcl9jb2RlKSB7CisgICAgICAgICAgICBjb2RlKys7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKmNvZGUgPT0gKHVpbnRwdHJfdCkgJm5neF9odHRwX3Jld3JpdGVfbm9wX2NvZGUpIHsKKyAgICAgICAgICAgIGNvZGUrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghKGNvZGUgPSBuZ3hfYXJyYXlfcHVzaF9uKGNvbmYtPmNvZGVzLCBzaXplb2YodWludHB0cl90KSkpKSB7CiAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICB9CiAKLSAgICBuZ3hfaW5pdF9hcnJheShydWxlLT5vcHMsIGNmLT5wb29sLCA1LCBzaXplb2Yobmd4X2h0dHBfcmV3cml0ZV9vcF90KSwKLSAgICAgICAgICAgICAgICAgICBOR1hfQ09ORl9FUlJPUik7CisgICAgKmNvZGUgPSAodWludHB0cl90KSBOVUxMOwogCi0gICAgcnVsZS0+bmNhcHR1cmVzID0gMDsKLSAgICBydWxlLT5zaXplID0gMDsKLSAgICBydWxlLT5zdGF0dXMgPSAwOwotICAgIHJ1bGUtPmxhc3QgPSAwOworICAgIHJldHVybiBOR1hfQ09ORl9PSzsKK30KKworCitzdGF0aWMgY2hhciAqbmd4X2h0dHBfcmV3cml0ZShuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLCB2b2lkICpjb25mKQoreworICAgIG5neF9odHRwX3Jld3JpdGVfbG9jX2NvbmZfdCAqbGNmID0gY29uZjsKKyAgICAKKyAgICB1X2NoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhOworICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgc2l6ZTsKKyAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp2YWx1ZSwgZXJyOworICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIG4sIGxhc3Q7CisgICAgbmd4X2h0dHBfcmV3cml0ZV9jb2RlX3B0ICAgICAgICAgICAgICAqY29kZTsKKyAgICBuZ3hfaHR0cF9yZXdyaXRlX2NvcHlfY29kZV90ICAgICAgICAgICpjb3B5OworICAgIG5neF9odHRwX3Jld3JpdGVfcmVnZXhfY29kZV90ICAgICAgICAgKnJlZ2V4OworICAgIG5neF9odHRwX3Jld3JpdGVfcmVnZXhfZW5kX2NvZGVfdCAgICAgKnJlZ2V4X2VuZDsKKyAgICBuZ3hfaHR0cF9yZXdyaXRlX2NvcHlfY2FwdHVyZV9jb2RlX3QgICpjb3B5X2NhcHR1cmU7CisgICAgdV9jaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyc3RyW05HWF9NQVhfQ09ORl9FUlJTVFJdOworCisgICAgcmVnZXggPSBuZ3hfaHR0cF9yZXdyaXRlX3N0YXJ0X2NvZGUoY2YtPnBvb2wsICZsY2YtPmNvZGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfaHR0cF9yZXdyaXRlX3JlZ2V4X2NvZGVfdCkpOworICAgIGlmIChyZWdleCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICB9CiAKICAgICB2YWx1ZSA9IGNmLT5hcmdzLT5lbHRzOwogCi0gICAgLyogU1RVQiAqLyB7Ci0gICAgICAgIGVyci5sZW4gPSBOR1hfTUFYX0NPTkZfRVJSU1RSOwotICAgICAgICBlcnIuZGF0YSA9IGVycnN0cjsKKyAgICBlcnIubGVuID0gTkdYX01BWF9DT05GX0VSUlNUUjsKKyAgICBlcnIuZGF0YSA9IGVycnN0cjsKIAotICAgICAgICBydWxlLT5yZWdleCA9IG5neF9yZWdleF9jb21waWxlKCZ2YWx1ZVsxXSwgMCwgY2YtPnBvb2wsICZlcnIpOwotICAgIAotICAgICAgICBpZiAocnVsZS0+cmVnZXggPT0gTlVMTCkgewotICAgICAgICAgICAgbmd4X2NvbmZfbG9nX2Vycm9yKE5HWF9MT0dfRU1FUkcsIGNmLCAwLCAiJXMiLCBlcnIuZGF0YSk7Ci0gICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7Ci0gICAgICAgIH0KLSAgICAKLSAgICAgICAgcnVsZS0+cmVfbmFtZSA9IHZhbHVlWzFdOwotICAgICAgICBydWxlLT5zX25hbWUgPSB2YWx1ZVsyXTsKKyAgICAvKiBUT0RPOiBOR1hfUkVHRVhfQ0FTRUxFU1MgKi8KIAotICAgICAgICBpZiAobmd4X3N0cmNhc2VjbXAodmFsdWVbMl0uZGF0YSwgImZvcmJpZGRlbjoiKSA9PSAwKSB7CisgICAgcmVnZXgtPnJlZ2V4ID0gbmd4X3JlZ2V4X2NvbXBpbGUoJnZhbHVlWzFdLCAwLCBjZi0+cG9vbCwgJmVycik7CiAKLSAgICAgICAgICAgIGlmIChjZi0+YXJncy0+bmVsdHMgPT0gMykgewotICAgICAgICAgICAgICAgIHJ1bGUtPnN0YXR1cyA9IE5HWF9IVFRQX0ZPUkJJRERFTjsKLSAgICAgICAgICAgICAgICBydWxlLT5sYXN0ID0gMTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfT0s7Ci0gICAgICAgICAgICB9CisgICAgaWYgKHJlZ2V4LT5yZWdleCA9PSBOVUxMKSB7CisgICAgICAgIG5neF9jb25mX2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBjZiwgMCwgIiVzIiwgZXJyLmRhdGEpOworICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgfQogCisgICAgcmVnZXgtPmNvZGUgPSBuZ3hfaHR0cF9yZXdyaXRlX3JlZ2V4X3N0YXJ0X2NvZGU7CisgICAgcmVnZXgtPnNpemUgPSAwOworICAgIHJlZ2V4LT5uY2FwdHVyZXMgPSAwOworICAgIHJlZ2V4LT5zdGF0dXMgPSAwOworICAgIHJlZ2V4LT51cmkgPSAxOworICAgIHJlZ2V4LT5hcmdzID0gMTsKKyAgICByZWdleC0+cmVkaXJlY3QgPSAwOworICAgIHJlZ2V4LT5uYW1lID0gdmFsdWVbMV07CisKKyAgICBsYXN0ID0gMDsKKworICAgIGlmIChuZ3hfc3RybmNtcCh2YWx1ZVsyXS5kYXRhLCAiaHR0cDovLyIsIHNpemVvZigiaHR0cDovLyIpIC0gMSkgPT0gMCkgeworICAgICAgICByZWdleC0+c3RhdHVzID0gTkdYX0hUVFBfTU9WRURfVEVNUE9SQVJJTFk7CisgICAgICAgIHJlZ2V4LT5yZWRpcmVjdCA9IDE7CisgICAgICAgIGxhc3QgPSAxOworICAgIH0KKworICAgIGlmIChjZi0+YXJncy0+bmVsdHMgPT0gNCkgeworICAgICAgICBpZiAobmd4X3N0cmNtcCh2YWx1ZVszXS5kYXRhLCAibGFzdCIpID09IDApIHsKKyAgICAgICAgICAgIGxhc3QgPSAxOworCisgICAgICAgIH0gZWxzZSBpZiAobmd4X3N0cmNtcCh2YWx1ZVszXS5kYXRhLCAicmVkaXJlY3QiKSA9PSAwKSB7CisgICAgICAgICAgICByZWdleC0+c3RhdHVzID0gTkdYX0hUVFBfTU9WRURfVEVNUE9SQVJJTFk7CisgICAgICAgICAgICByZWdleC0+cmVkaXJlY3QgPSAxOworICAgICAgICAgICAgbGFzdCA9IDE7CisKKyAgICAgICAgfSBlbHNlIGlmIChuZ3hfc3RyY21wKHZhbHVlWzNdLmRhdGEsICJwZXJtYW5lbnQiKSA9PSAwKSB7CisgICAgICAgICAgICByZWdleC0+c3RhdHVzID0gTkdYX0hUVFBfTU9WRURfUEVSTUFORU5UTFk7CisgICAgICAgICAgICByZWdleC0+cmVkaXJlY3QgPSAxOworICAgICAgICAgICAgbGFzdCA9IDE7CisKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG5neF9jb25mX2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBjZiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBwYXJhbWV0ZXIgXCIlVlwiIiwgJnZhbHVlWzNdKTsKICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICAgICAgfQorICAgIH0KIAotICAgICAgICBpID0gMDsKKyAgICBpID0gMDsKIAotICAgICAgICB3aGlsZSAoaSA8IHZhbHVlWzJdLmxlbikgeworICAgIHdoaWxlIChpIDwgdmFsdWVbMl0ubGVuKSB7CiAKLSAgICAgICAgICAgIGlmICghKG9wID0gbmd4X3B1c2hfYXJyYXkoJnJ1bGUtPm9wcykpKSB7CisgICAgICAgIGRhdGEgPSAmdmFsdWVbMl0uZGF0YVtpXTsKKworICAgICAgICBpZiAodmFsdWVbMl0uZGF0YVtpXSA9PSAnJCcgJiYgaSA8IHZhbHVlWzJdLmxlbgorICAgICAgICAgICAgJiYgdmFsdWVbMl0uZGF0YVtpICsgMV0gPj0gJzEnICYmIHZhbHVlWzJdLmRhdGFbaSArIDFdIDw9ICc5JykKKyAgICAgICAgeworCisgICAgICAgICAgICAvKiB0aGUgIiQxIiAtICIkOSIgY2FwdHVyZXMgKi8KKworICAgICAgICAgICAgY29weV9jYXB0dXJlID0gbmd4X2h0dHBfcmV3cml0ZV9hZGRfY29kZShsY2YtPmNvZGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfaHR0cF9yZXdyaXRlX2NvcHlfY2FwdHVyZV9jb2RlX3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1X2NoYXIgKiopICZyZWdleCk7CisgICAgICAgICAgICBpZiAoY29weV9jYXB0dXJlID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGRhdGEgPSAmdmFsdWVbMl0uZGF0YVtpXTsKLQotICAgICAgICAgICAgaWYgKHZhbHVlWzJdLmRhdGFbaV0gPT0gJyQnCi0gICAgICAgICAgICAgICAgJiYgaSA8IHZhbHVlWzJdLmxlbgotICAgICAgICAgICAgICAgICYmIHZhbHVlWzJdLmRhdGFbaSArIDFdID49ICcxJwotICAgICAgICAgICAgICAgICYmIHZhbHVlWzJdLmRhdGFbaSArIDFdIDw9ICc5JykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvcC0+b3AgPSBOR1hfSFRUUF9SRVdSSVRFX0NPUFlfQ0FQVFVSRTsgCi0gICAgICAgICAgICAgICAgb3AtPmxlbiA9IDA7Ci0gICAgICAgICAgICAgICAgb3AtPmRhdGEgPSB2YWx1ZVsyXS5kYXRhWysraV0gLSAnMCc7Ci0KLSAgICAgICAgICAgICAgICBpZiAocnVsZS0+bmNhcHR1cmVzIDwgb3AtPmRhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgcnVsZS0+bmNhcHR1cmVzID0gb3AtPmRhdGE7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaSsrOwotCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh2YWx1ZVsyXS5kYXRhW2ldID09ICc/JykgewotICAgICAgICAgICAgICAgIG9wLT5vcCA9IE5HWF9IVFRQX1JFV1JJVEVfU1RBUlRfQVJHUzsgCi0gICAgICAgICAgICAgICAgb3AtPmxlbiA9IDA7Ci0gICAgICAgICAgICAgICAgb3AtPmRhdGEgPSAwOwotCi0gICAgICAgICAgICAgICAgaSsrOwotCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KICAgICAgICAgICAgIGkrKzsKIAotICAgICAgICAgICAgd2hpbGUgKGkgPCB2YWx1ZVsyXS5sZW4KLSAgICAgICAgICAgICAgICAgICAmJiB2YWx1ZVsyXS5kYXRhW2ldICE9ICckJwotICAgICAgICAgICAgICAgICAgICYmIHZhbHVlWzJdLmRhdGFbaV0gIT0gJz8nKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIGNvcHlfY2FwdHVyZS0+Y29kZSA9IG5neF9odHRwX3Jld3JpdGVfY29weV9jYXB0dXJlX2NvZGU7CisgICAgICAgICAgICBjb3B5X2NhcHR1cmUtPm4gPSB2YWx1ZVsyXS5kYXRhW2ldIC0gJzAnOworCisgICAgICAgICAgICBpZiAocmVnZXgtPm5jYXB0dXJlcyA8IGNvcHlfY2FwdHVyZS0+bikgeworICAgICAgICAgICAgICAgIHJlZ2V4LT5uY2FwdHVyZXMgPSBjb3B5X2NhcHR1cmUtPm47CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGxlbiA9ICZ2YWx1ZVsyXS5kYXRhW2ldIC0gZGF0YTsKLSAgICAgICAgICAgIHJ1bGUtPnNpemUgKz0gbGVuOworICAgICAgICAgICAgY29weV9jYXB0dXJlLT5uICo9IDI7CiAKLSAgICAgICAgICAgIGlmIChsZW4pIHsKKyAgICAgICAgICAgIGkrKzsKIAotICAgICAgICAgICAgICAgIG9wLT5sZW4gPSBsZW47CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKGxlbiA8PSBzaXplb2YodWludHB0cl90KSkgewotICAgICAgICAgICAgICAgICAgICBvcC0+b3AgPSBOR1hfSFRUUF9SRVdSSVRFX0NPUFlfU0hPUlQ7IAotICAgICAgICAgICAgICAgICAgICBvcC0+ZGF0YSA9IDA7CisgICAgICAgIGlmICh2YWx1ZVsyXS5kYXRhW2ldID09ICc/JykgewogCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChsZW4tLSkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3AtPmRhdGEgPDw9IDg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcC0+ZGF0YSB8PSBkYXRhW2xlbl07Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIHRoZSBhcmd1bWVudHMgKi8KIAotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG9wLT5vcCA9IE5HWF9IVFRQX1JFV1JJVEVfQ09QWV9MT05HOworICAgICAgICAgICAgaWYgKGkgPT0gdmFsdWVbMl0ubGVuIC0gMSkgeworICAgICAgICAgICAgICAgIC8qIHRoZSBsYXN0ICI/IiBkcm9wcyB0aGUgb3JpZ2luYWwgYXJndW1lbnRzICovCisgICAgICAgICAgICAgICAgcmVnZXgtPmFyZ3MgPSAwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIGlmICghKHAgPSBuZ3hfcGFsbG9jKGNmLT5wb29sLCBsZW4pKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgbmd4X21lbWNweShwLCBkYXRhLCBsZW4pOwotICAgICAgICAgICAgICAgICAgICBvcC0+ZGF0YSA9ICh1aW50cHRyX3QpIHA7CisgICAgICAgICAgICBpZiAoIXJlZ2V4LT5yZWRpcmVjdCkgeworICAgICAgICAgICAgICAgIGNvZGUgPSBuZ3hfaHR0cF9yZXdyaXRlX2FkZF9jb2RlKGxjZi0+Y29kZXMsIHNpemVvZih1aW50cHRyX3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1X2NoYXIgKiopICZyZWdleCk7CisgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKmNvZGUgPSBuZ3hfaHR0cF9yZXdyaXRlX3N0YXJ0X2FyZ3NfY29kZTsKKworICAgICAgICAgICAgICAgIGkrKzsKKworICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgbiA9IG5neF9yZWdleF9jYXB0dXJlX2NvdW50KHJ1bGUtPnJlZ2V4KTsKKyAgICAgICAgaSsrOwogCi0gICAgICAgIGlmIChydWxlLT5uY2FwdHVyZXMgPiBuKSB7Ci0gICAgICAgICAgICBuZ3hfY29uZl9sb2dfZXJyb3IoTkdYX0xPR19FTUVSRywgY2YsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhdHRlcm4gXCIlVlwiIGhhcyBsZXNzIGNhcHR1cmVzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhhbiByZWZlcnJlbmNlZCBpbiBzdWJzdGl0dXRpb24gXCIlVlwiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVbMV0sICZ2YWx1ZVsyXSk7CisgICAgICAgIC8qIHRoZSBzdWJzdGl0dWlvbiBzdHJpbmdzICovCisKKyAgICAgICAgd2hpbGUgKGkgPCB2YWx1ZVsyXS5sZW4gJiYgdmFsdWVbMl0uZGF0YVtpXSAhPSAnJCcpIHsKKworICAgICAgICAgICAgaWYgKHZhbHVlWzJdLmRhdGFbaV0gPT0gJz8nKSB7CisKKyAgICAgICAgICAgICAgICBpZiAoaSA9PSB2YWx1ZVsyXS5sZW4gLSAxKSB7CisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAqIHRoZSBsYXN0ICI/IiBkcm9wcyB0aGUgb3JpZ2luYWwgYXJndW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgKiBhbmQgaXQgc2hvdWxkIG5vdCBiZSBjb3BpZWQgdG8gYSBzdWJzdGl0dWlvbgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgcmVnZXgtPmFyZ3MgPSAwOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIXJlZ2V4LT5yZWRpcmVjdCkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgfQorCisgICAgICAgIGxlbiA9ICZ2YWx1ZVsyXS5kYXRhW2ldIC0gZGF0YTsKKworICAgICAgICBpZiAobGVuID09IDApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgcmVnZXgtPnNpemUgKz0gbGVuOworCisgICAgICAgIHNpemUgPSAobGVuICsgc2l6ZW9mKHVpbnRwdHJfdCkgLSAxKSAmIH4oc2l6ZW9mKHVpbnRwdHJfdCkgLSAxKTsKKworICAgICAgICBjb3B5ID0gbmd4X2h0dHBfcmV3cml0ZV9hZGRfY29kZShsY2YtPmNvZGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yobmd4X2h0dHBfcmV3cml0ZV9jb3B5X2NvZGVfdCkgKyBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodV9jaGFyICoqKSAmcmVnZXgpOworICAgICAgICBpZiAoY29weSA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAocnVsZS0+bmNhcHR1cmVzIDwgbikgewotICAgICAgICAgICAgcnVsZS0+bmNhcHR1cmVzID0gbjsKKyAgICAgICAgY29weS0+Y29kZSA9IG5neF9odHRwX3Jld3JpdGVfY29weV9jb2RlOworICAgICAgICBjb3B5LT5sZW4gPSBsZW47CisKKyAgICAgICAgbmd4X21lbWNweSgodV9jaGFyICopIGNvcHkgKyBzaXplb2Yobmd4X2h0dHBfcmV3cml0ZV9jb3B5X2NvZGVfdCksCisgICAgICAgICAgICAgICAgICAgZGF0YSwgbGVuKTsKKyAgICB9CisKKyAgICBuID0gbmd4X3JlZ2V4X2NhcHR1cmVfY291bnQocmVnZXgtPnJlZ2V4KTsKKworICAgIGlmIChyZWdleC0+bmNhcHR1cmVzID4gbikgeworICAgICAgICBuZ3hfY29uZl9sb2dfZXJyb3IoTkdYX0xPR19FTUVSRywgY2YsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAicGF0dGVybiBcIiVWXCIgaGFzIGxlc3MgY2FwdHVyZXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoYW4gcmVmZXJyZW5jZWQgaW4gc3Vic3RpdHV0aW9uIFwiJVZcIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVbMV0sICZ2YWx1ZVsyXSk7CisgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICB9CisKKyAgICBpZiAocmVnZXgtPm5jYXB0dXJlcyA8IG4pIHsKKyAgICAgICAgcmVnZXgtPm5jYXB0dXJlcyA9IG47CisgICAgfQorCisgICAgaWYgKHJlZ2V4LT5uY2FwdHVyZXMpIHsKKyAgICAgICAgcmVnZXgtPm5jYXB0dXJlcyA9IChyZWdleC0+bmNhcHR1cmVzICsgMSkgKiAzOworICAgIH0KKworICAgIHJlZ2V4X2VuZCA9IG5neF9odHRwX3Jld3JpdGVfYWRkX2NvZGUobGNmLT5jb2RlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yobmd4X2h0dHBfcmV3cml0ZV9yZWdleF9lbmRfY29kZV90KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodV9jaGFyICoqKSAmcmVnZXgpOworICAgIGlmIChyZWdleF9lbmQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgfQorCisgICAgcmVnZXhfZW5kLT5jb2RlID0gbmd4X2h0dHBfcmV3cml0ZV9yZWdleF9lbmRfY29kZTsKKyAgICByZWdleF9lbmQtPnVyaSA9IHJlZ2V4LT51cmk7CisgICAgcmVnZXhfZW5kLT5hcmdzID0gcmVnZXgtPmFyZ3M7CisgICAgcmVnZXhfZW5kLT5yZWRpcmVjdCA9IHJlZ2V4LT5yZWRpcmVjdDsKKworICAgIGlmIChsYXN0KSB7CisgICAgICAgIGNvZGUgPSBuZ3hfaHR0cF9yZXdyaXRlX2FkZF9jb2RlKGxjZi0+Y29kZXMsIHNpemVvZih1aW50cHRyX3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodV9jaGFyICoqKSAmcmVnZXgpOworICAgICAgICBpZiAoY29kZSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAocnVsZS0+bmNhcHR1cmVzKSB7Ci0gICAgICAgICAgICBydWxlLT5uY2FwdHVyZXMgPSAocnVsZS0+bmNhcHR1cmVzICsgMSkgKiAzOworICAgICAgICAqY29kZSA9ICh1aW50cHRyX3QpIE5VTEw7CisgICAgfQorCisgICAgcmVnZXgtPm5leHQgPSAodV9jaGFyICopIGxjZi0+Y29kZXMtPmVsdHMgKyBsY2YtPmNvZGVzLT5uZWx0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gKHVfY2hhciAqKSByZWdleDsKKworICAgIHJldHVybiBOR1hfQ09ORl9PSzsKK30KKworCisKK3N0YXRpYyBjaGFyICpuZ3hfaHR0cF9yZXdyaXRlX3JldHVybihuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNvbmYpCit7CisgICAgbmd4X2h0dHBfcmV3cml0ZV9sb2NfY29uZl90ICpsY2YgPSBjb25mOworCisgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgICAgICAqdmFsdWU7CisgICAgbmd4X2h0dHBfcmV3cml0ZV9yZXR1cm5fY29kZV90ICAqcmV0OworCisgICAgcmV0ID0gbmd4X2h0dHBfcmV3cml0ZV9zdGFydF9jb2RlKGNmLT5wb29sLCAmbGNmLT5jb2RlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5neF9odHRwX3Jld3JpdGVfcmV0dXJuX2NvZGVfdCkpOworICAgIGlmIChyZXQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgfQorCisgICAgdmFsdWUgPSBjZi0+YXJncy0+ZWx0czsKKworICAgIHJldC0+Y29kZSA9IG5neF9odHRwX3Jld3JpdGVfcmV0dXJuX2NvZGU7CisgICAgcmV0LT5udWxsID0gKHVpbnRwdHJfdCkgTlVMTDsKKworICAgIHJldC0+c3RhdHVzID0gbmd4X2F0b2kodmFsdWVbMV0uZGF0YSwgdmFsdWVbMV0ubGVuKTsKKworICAgIGlmIChyZXQtPnN0YXR1cyA9PSAodWludHB0cl90KSBOR1hfRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBOR1hfQ09ORl9PSzsKK30KKworCitzdGF0aWMgY2hhciAqbmd4X2h0dHBfcmV3cml0ZV9pZihuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLCB2b2lkICpjb25mKQoreworICAgIG5neF9odHRwX3Jld3JpdGVfbG9jX2NvbmZfdCAqbGNmID0gY29uZjsKKworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgKm1jb25mOworICAgIGNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgKnJ2OworICAgIHVfY2hhciAgICAgICAgICAgICAgICAgICAgICAgKmVsdHM7CisgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgICAqdmFsdWU7CisgICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgICAgaTsKKyAgICBuZ3hfY29uZl90ICAgICAgICAgICAgICAgICAgICBzYXZlOworICAgIG5neF9odHRwX3Jld3JpdGVfY29kZV9wdCAgICAgKmNvZGU7CisgICAgbmd4X2h0dHBfbW9kdWxlX3QgICAgICAgICAgICAqbW9kdWxlOworICAgIG5neF9odHRwX2NvbmZfY3R4X3QgICAgICAgICAgKmN0eCwgKnBjdHg7CisgICAgbmd4X2h0dHBfdmFyaWFibGVfdCAgICAgICAgICAqdmFyOworICAgIG5neF9odHRwX2NvcmVfbG9jX2NvbmZfdCAgICAgKmNsY2YsICpwY2xjZiwgKipjbGNmcDsKKyAgICBuZ3hfaHR0cF9jb3JlX21haW5fY29uZl90ICAgICpjbWNmOworICAgIG5neF9odHRwX3Jld3JpdGVfaWZfY29kZV90ICAgKmlmX2NvZGU7CisgICAgbmd4X2h0dHBfcmV3cml0ZV92YXJfY29kZV90ICAqdmFyX2NvZGU7CisgICAgbmd4X2h0dHBfcmV3cml0ZV9sb2NfY29uZl90ICAqbmxjZjsKKworICAgIGlmICghKGN0eCA9IG5neF9wY2FsbG9jKGNmLT5wb29sLCBzaXplb2Yobmd4X2h0dHBfY29uZl9jdHhfdCkpKSkgeworICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgfQorCisgICAgcGN0eCA9IGNmLT5jdHg7CisgICAgY3R4LT5tYWluX2NvbmYgPSBwY3R4LT5tYWluX2NvbmY7CisgICAgY3R4LT5zcnZfY29uZiA9IHBjdHgtPnNydl9jb25mOyAKKworICAgIGN0eC0+bG9jX2NvbmYgPSBuZ3hfcGNhbGxvYyhjZi0+cG9vbCwgc2l6ZW9mKHZvaWQgKikgKiBuZ3hfaHR0cF9tYXhfbW9kdWxlKTsKKyAgICBpZiAoY3R4LT5sb2NfY29uZiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBuZ3hfbW9kdWxlc1tpXTsgaSsrKSB7CisgICAgICAgIGlmIChuZ3hfbW9kdWxlc1tpXS0+dHlwZSAhPSBOR1hfSFRUUF9NT0RVTEUpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKGNmLT5hcmdzLT5uZWx0cyA+IDMpIHsKLSAgICAgICAgICAgIGlmIChuZ3hfc3RyY21wKHZhbHVlWzNdLmRhdGEsICJsYXN0IikgPT0gMCkgewotICAgICAgICAgICAgICAgIHJ1bGUtPmxhc3QgPSAxOworICAgICAgICBtb2R1bGUgPSBuZ3hfbW9kdWxlc1tpXS0+Y3R4OworICAgIAorICAgICAgICBpZiAobW9kdWxlLT5jcmVhdGVfbG9jX2NvbmYpIHsKIAotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBuZ3hfY29uZl9sb2dfZXJyb3IoTkdYX0xPR19FTUVSRywgY2YsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIHBhcmFtZXRlciBcIiVWXCIiLCAmdmFsdWVbM10pOwotICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICAgICAgICAgIGlmICghKG1jb25mID0gbW9kdWxlLT5jcmVhdGVfbG9jX2NvbmYoY2YpKSkgeworICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGN0eC0+bG9jX2NvbmZbbmd4X21vZHVsZXNbaV0tPmN0eF9pbmRleF0gPSBtY29uZjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHBjbGNmID0gcGN0eC0+bG9jX2NvbmZbbmd4X2h0dHBfY29yZV9tb2R1bGUuY3R4X2luZGV4XTsKKworICAgIGNsY2YgPSBjdHgtPmxvY19jb25mW25neF9odHRwX2NvcmVfbW9kdWxlLmN0eF9pbmRleF07CisgICAgY2xjZi0+bG9jX2NvbmYgPSBjdHgtPmxvY19jb25mOworICAgIGNsY2YtPm5hbWUgPSBwY2xjZi0+bmFtZTsKKyAgICBjbGNmLT5ub25hbWUgPSAxOworCisgICAgaWYgKHBjbGNmLT5sb2NhdGlvbnMuZWx0cyA9PSBOVUxMKSB7CisgICAgICAgIGlmIChuZ3hfYXJyYXlfaW5pdCgmcGNsY2YtPmxvY2F0aW9ucywgY2YtPnBvb2wsIDQsIHNpemVvZih2b2lkICopKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gTkdYX0VSUk9SKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIShjbGNmcCA9IG5neF9wdXNoX2FycmF5KCZwY2xjZi0+bG9jYXRpb25zKSkpIHsKKyAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgIH0KKworICAgICpjbGNmcCA9IGNsY2Y7CisKKworICAgIC8qIFNUVUI6ICJpZiAoJHZhcikiICovCisKKyAgICB2YWx1ZSA9IGNmLT5hcmdzLT5lbHRzOworCisgICAgaWYgKHZhbHVlWzFdLmxlbiA8IDIKKyAgICAgICAgfHwgdmFsdWVbMV0uZGF0YVswXSAhPSAnKCcKKyAgICAgICAgfHwgdmFsdWVbMV0uZGF0YVsxXSAhPSAnJCcKKyAgICAgICAgfHwgdmFsdWVbMV0uZGF0YVt2YWx1ZVsxXS5sZW4gLSAxXSAhPSAnKScpCisgICAgeworICAgICAgICBuZ3hfY29uZl9sb2dfZXJyb3IoTkdYX0xPR19FTUVSRywgY2YsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBjb25kaXRpb24gXCIlVlwiIiwgJnZhbHVlWzFdKTsKKyAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgIH0KKworICAgIHZhbHVlWzFdLmxlbiAtPSAzOworICAgIHZhbHVlWzFdLmRhdGEgKz0gMjsKKworICAgIGlmICh2YWx1ZVsxXS5sZW4gPT0gc2l6ZW9mKCJpbnZhbGlkX3JlZmVyZXIiKSAtIDEKKyAgICAgICAgJiYgbmd4X3N0cm5jbXAodmFsdWVbMV0uZGF0YSwgImludmFsaWRfcmVmZXJlciIsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigiaW52YWxpZF9yZWZlcmVyIikgLSAxKSA9PSAwKQorICAgIHsKKyAgICAgICAgY29kZSA9IG5neF9odHRwX3Jld3JpdGVfc3RhcnRfY29kZShjZi0+cG9vbCwgJmxjZi0+Y29kZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5neF9odHRwX3Jld3JpdGVfY29kZV9wdCkpOworICAgICAgICBpZiAoY29kZSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICAqY29kZSA9IG5neF9odHRwX3Jld3JpdGVfaW52YWxpZF9yZWZlcmVyX2NvZGU7CisKKyAgICB9IGVsc2UgeworCisgICAgICAgIGNtY2YgPSBuZ3hfaHR0cF9jb25mX2dldF9tb2R1bGVfbWFpbl9jb25mKGNmLCBuZ3hfaHR0cF9jb3JlX21vZHVsZSk7CisKKyAgICAgICAgdmFyID0gY21jZi0+dmFyaWFibGVzLmVsdHM7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjbWNmLT52YXJpYWJsZXMubmVsdHM7IGkrKykgeworICAgICAgICAgICAgaWYgKHZhcltpXS5uYW1lLmxlbiAhPSB2YWx1ZVsxXS5sZW4pIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG5neF9zdHJuY2FzZWNtcCh2YXJbaV0ubmFtZS5kYXRhLCB2YWx1ZVsxXS5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJbaV0ubmFtZS5sZW4pID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKworICAgICAgICBpZiAoaSA9PSBjbWNmLT52YXJpYWJsZXMubmVsdHMpIHsKKyAgICAgICAgICAgIG5neF9jb25mX2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBjZiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5rbm93biB2YXJpYWJsZSBuYW1lIFwiJVZcIiIsICZ2YWx1ZVsxXSk7CisgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICB2YXJfY29kZSA9IG5neF9odHRwX3Jld3JpdGVfc3RhcnRfY29kZShjZi0+cG9vbCwgJmxjZi0+Y29kZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5neF9odHRwX3Jld3JpdGVfdmFyX2NvZGVfdCkpOworICAgICAgICBpZiAodmFyX2NvZGUgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgdmFyX2NvZGUtPmNvZGUgPSBuZ3hfaHR0cF9yZXdyaXRlX3Zhcl9jb2RlOworICAgICAgICB2YXJfY29kZS0+aW5kZXggPSB2YXJbaV0uaW5kZXg7CisgICAgfQorCisgICAgaWZfY29kZSA9IG5neF9hcnJheV9wdXNoX24obGNmLT5jb2Rlcywgc2l6ZW9mKG5neF9odHRwX3Jld3JpdGVfaWZfY29kZV90KSk7CisgICAgaWYgKGlmX2NvZGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZl9jb2RlLT5jb2RlID0gbmd4X2h0dHBfcmV3cml0ZV9pZl9jb2RlOworCisgICAgZWx0cyA9IGxjZi0+Y29kZXMtPmVsdHM7CisKKworICAgIC8qIHRoZSBpbnNpZGUgZGlyZWN0aXZlcyBtdXN0IGNvbXBpbGUgdG8gdGhlIHNhbWUgY29kZSBhcnJheSAqLworCisgICAgbmxjZiA9IGN0eC0+bG9jX2NvbmZbbmd4X2h0dHBfcmV3cml0ZV9tb2R1bGUuY3R4X2luZGV4XTsKKyAgICBubGNmLT5jb2RlcyA9IGxjZi0+Y29kZXM7CisKKworICAgIHNhdmUgPSAqY2Y7CisgICAgY2YtPmN0eCA9IGN0eDsKKworICAgIGlmIChwY2xjZi0+bmFtZS5sZW4gPT0gMCkgeworICAgICAgICBpZl9jb2RlLT5sb2NfY29uZiA9IE5VTEw7CisgICAgICAgIGNmLT5jbWRfdHlwZSA9IE5HWF9IVFRQX1NJRl9DT05GOworCisgICAgfSBlbHNlIHsKKyAgICAgICAgaWZfY29kZS0+bG9jX2NvbmYgPSBjdHgtPmxvY19jb25mOworICAgICAgICBjZi0+Y21kX3R5cGUgPSBOR1hfSFRUUF9MSUZfQ09ORjsKKyAgICB9CisKKyAgICBydiA9IG5neF9jb25mX3BhcnNlKGNmLCBOVUxMKTsKKworICAgICpjZiA9IHNhdmU7CisKKyAgICBpZiAocnYgIT0gTkdYX0NPTkZfT0spIHsKKyAgICAgICAgcmV0dXJuIHJ2OworICAgIH0KKworCisgICAgaWYgKGVsdHMgIT0gbGNmLT5jb2Rlcy0+ZWx0cykgeworICAgICAgICBpZl9jb2RlID0gKG5neF9odHRwX3Jld3JpdGVfaWZfY29kZV90ICopCisgICAgICAgICAgICAgICAgICAgKCh1X2NoYXIgKikgaWZfY29kZSArICgodV9jaGFyICopIGxjZi0+Y29kZXMtPmVsdHMgLSBlbHRzKSk7CisgICAgfQorCisgICAgaWZfY29kZS0+bmV4dCA9ICh1X2NoYXIgKikgbGNmLT5jb2Rlcy0+ZWx0cyArIGxjZi0+Y29kZXMtPm5lbHRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtICh1X2NoYXIgKikgaWZfY29kZTsKKworICAgIHJldHVybiBOR1hfQ09ORl9PSzsKK30KKworCitzdGF0aWMgY2hhciAqbmd4X2h0dHBfcmV3cml0ZV92YWxpZF9yZWZlcmVycyhuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY29uZikKK3sKKyAgICBuZ3hfaHR0cF9yZXdyaXRlX2xvY19jb25mX3QgKmxjZiA9IGNvbmY7CisKKyAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgIGksIHNlcnZlcl9uYW1lczsKKyAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgICAgKnZhbHVlOworICAgIG5neF9odHRwX3NlcnZlcl9uYW1lX3QgICAgICAqc247CisgICAgbmd4X2h0dHBfY29yZV9zcnZfY29uZl90ICAgICpjc2NmOworICAgIG5neF9odHRwX3Jld3JpdGVfcmVmZXJlcl90ICAqcmVmOworCisgICAgY3NjZiA9IG5neF9odHRwX2NvbmZfZ2V0X21vZHVsZV9zcnZfY29uZihjZiwgbmd4X2h0dHBfY29yZV9tb2R1bGUpOworCisgICAgaWYgKGxjZi0+cmVmZXJlcnMgPT0gTlVMTCkgeworICAgICAgICBsY2YtPnJlZmVyZXJzID0gbmd4X2FycmF5X2NyZWF0ZShjZi0+cG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmLT5hcmdzLT5uZWx0cyArIGNzY2YtPnNlcnZlcl9uYW1lcy5uZWx0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfaHR0cF9yZXdyaXRlX3JlZmVyZXJfdCkpOworICAgICAgICBpZiAobGNmLT5yZWZlcmVycyA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2YWx1ZSA9IGNmLT5hcmdzLT5lbHRzOworICAgIHNlcnZlcl9uYW1lcyA9IDA7CisKKyAgICBmb3IgKGkgPSAxOyBpIDwgY2YtPmFyZ3MtPm5lbHRzOyBpKyspIHsKKyAgICAgICAgaWYgKHZhbHVlW2ldLmxlbiA9PSAwKSB7CisgICAgICAgICAgICBuZ3hfY29uZl9sb2dfZXJyb3IoTkdYX0xPR19FTUVSRywgY2YsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgcmVmZXJlciBcIiVWXCIiLCAmdmFsdWVbaV0pOworICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5neF9zdHJjbXAodmFsdWVbaV0uZGF0YSwgIm5vbmUiKSA9PSAwKSB7CisgICAgICAgICAgICBsY2YtPm5vX3JlZmVyZXIgPSAxOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAobmd4X3N0cmNtcCh2YWx1ZVtpXS5kYXRhLCAic2VydmVyX25hbWVzIikgPT0gMCkgeworICAgICAgICAgICAgc2VydmVyX25hbWVzID0gMTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCEocmVmID0gbmd4X2FycmF5X3B1c2gobGNmLT5yZWZlcmVycykpKSB7CisgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBpZiAodmFsdWVbaV0uZGF0YVswXSAhPSAnKicpIHsKKyAgICAgICAgICAgIHJlZi0+bmFtZSA9IHZhbHVlW2ldOworICAgICAgICAgICAgcmVmLT53aWxkY2FyZCA9IDA7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh2YWx1ZVtpXS5kYXRhWzFdICE9ICcuJykgeworICAgICAgICAgICAgbmd4X2NvbmZfbG9nX2Vycm9yKE5HWF9MT0dfRU1FUkcsIGNmLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIHdpbGRjYXJkIHJlZmVyZXIgXCIlVlwiIiwgJnZhbHVlW2ldKTsKKyAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIHJlZi0+bmFtZS5sZW4gPSB2YWx1ZVtpXS5sZW4gLSAxOworICAgICAgICByZWYtPm5hbWUuZGF0YSA9IHZhbHVlW2ldLmRhdGEgKyAxOworICAgICAgICByZWYtPndpbGRjYXJkID0gMTsKKyAgICB9CisKKyAgICBpZiAoIXNlcnZlcl9uYW1lcykgeworICAgICAgICByZXR1cm4gTkdYX0NPTkZfT0s7CisgICAgfQorCisgICAgc24gPSBjc2NmLT5zZXJ2ZXJfbmFtZXMuZWx0czsKKyAgICBmb3IgKGkgPSAwOyBpIDwgY3NjZi0+c2VydmVyX25hbWVzLm5lbHRzOyBpKyspIHsKKyAgICAgICAgaWYgKCEocmVmID0gbmd4X2FycmF5X3B1c2gobGNmLT5yZWZlcmVycykpKSB7CisgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICByZWYtPm5hbWUubGVuID0gc25baV0ubmFtZS5sZW4gKyAxOworICAgICAgICBpZiAoIShyZWYtPm5hbWUuZGF0YSA9IG5neF9wYWxsb2MoY2YtPnBvb2wsIHJlZi0+bmFtZS5sZW4pKSkgeworICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgbmd4X21lbWNweShyZWYtPm5hbWUuZGF0YSwgc25baV0ubmFtZS5kYXRhLCBzbltpXS5uYW1lLmxlbik7CisgICAgICAgIHJlZi0+bmFtZS5kYXRhW3NuW2ldLm5hbWUubGVuXSA9ICcvJzsKKyAgICAgICAgcmVmLT53aWxkY2FyZCA9IHNuW2ldLndpbGRjYXJkOwogICAgIH0KIAogICAgIHJldHVybiBOR1hfQ09ORl9PSzsKIH0KIAogCi1zdGF0aWMgY2hhciAqbmd4X2h0dHBfcmVkaXJlY3Qobmd4X2NvbmZfdCAqY2YsIHZvaWQgKnBvc3QsIHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCAqbmd4X2h0dHBfcmV3cml0ZV9zdGFydF9jb2RlKG5neF9wb29sX3QgKnBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9hcnJheV90ICoqY29kZXMsIHNpemVfdCBzaXplKQogewotICAgIG5neF9odHRwX2NvcmVfbG9jX2NvbmZfdCAgKmNsY2Y7CisgICAgaWYgKCpjb2RlcyA9PSBOVUxMKSB7CisgICAgICAgIGlmICghKCpjb2RlcyA9IG5neF9hcnJheV9jcmVhdGUocG9vbCwgMjU2LCAxKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQogCi0gICAgY2xjZiA9IG5neF9odHRwX2NvbmZfZ2V0X21vZHVsZV9sb2NfY29uZihjZiwgbmd4X2h0dHBfY29yZV9tb2R1bGUpOwotICAgIGNsY2YtPmhhbmRsZXIgPSBuZ3hfaHR0cF9yZWRpcmVjdF9oYW5kbGVyOwotCi0gICAgcmV0dXJuIE5HWF9DT05GX09LOworICAgIHJldHVybiBuZ3hfYXJyYXlfcHVzaF9uKCpjb2Rlcywgc2l6ZSk7CiB9CiAKIAotc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9yZXdyaXRlX2luaXQobmd4X2N5Y2xlX3QgKmN5Y2xlKQorc3RhdGljIHZvaWQgKm5neF9odHRwX3Jld3JpdGVfYWRkX2NvZGUobmd4X2FycmF5X3QgKmNvZGVzLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqKm1haW4pCiB7Ci0gICAgbmd4X2h0dHBfaGFuZGxlcl9wdCAgICAgICAgKmg7Ci0gICAgbmd4X2h0dHBfY29yZV9tYWluX2NvbmZfdCAgKmNtY2Y7CisgICAgdV9jaGFyICAqZWx0czsKKyAgICB2b2lkICAgICpuZXc7CiAKLSAgICBjbWNmID0gbmd4X2h0dHBfY3ljbGVfZ2V0X21vZHVsZV9tYWluX2NvbmYoY3ljbGUsIG5neF9odHRwX2NvcmVfbW9kdWxlKTsKKyAgICBlbHRzID0gY29kZXMtPmVsdHM7CiAKLSAgICBoID0gbmd4X3B1c2hfYXJyYXkoJmNtY2YtPnBoYXNlc1tOR1hfSFRUUF9SRVdSSVRFX1BIQVNFXS5oYW5kbGVycyk7Ci0gICAgaWYgKGggPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgIGlmICghKG5ldyA9IG5neF9hcnJheV9wdXNoX24oY29kZXMsIHNpemUpKSkgeworICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgfQogCi0gICAgKmggPSBuZ3hfaHR0cF9yZXdyaXRlX2hhbmRsZXI7CisgICAgaWYgKGVsdHMgIT0gY29kZXMtPmVsdHMpIHsKKyAgICAgICAgKm1haW4gKz0gKHVfY2hhciAqKSBjb2Rlcy0+ZWx0cyAtIGVsdHM7CisgICAgfQogCi0gICAgcmV0dXJuIE5HWF9PSzsKKyAgICByZXR1cm4gbmV3OwogfQpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9zc2xfbW9kdWxlLmMgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3NzbF9tb2R1bGUuYwppbmRleCA5Y2I2ZTE3Li44ODNlNDRmIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3NzbF9tb2R1bGUuYworKysgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3NzbF9tb2R1bGUuYwpAQCAtNzMsNyArNzMsNyBAQAogICAgIG5neF9odHRwX3NzbF9tZXJnZV9zcnZfY29uZiwgICAgICAgICAgIC8qIG1lcmdlIHNlcnZlciBjb25maWd1cmF0aW9uICovCiAKICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjcmVhdGUgbG9jYXRpb24gY29uZmlndXJhdGlvbiAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1lcmdlIGxvY2F0aW9uIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtZXJnZSBsb2NhdGlvbiBjb25maWd1cmF0aW9uICovCiB9OwogCiAKZGlmZiAtLWdpdCBhL3NyYy9odHRwL21vZHVsZXMvcHJveHkvbmd4X2h0dHBfcHJveHlfaGFuZGxlci5jIGIvc3JjL2h0dHAvbW9kdWxlcy9wcm94eS9uZ3hfaHR0cF9wcm94eV9oYW5kbGVyLmMKaW5kZXggZWEzYTBjYS4uYTE5NWI0NSAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbW9kdWxlcy9wcm94eS9uZ3hfaHR0cF9wcm94eV9oYW5kbGVyLmMKKysrIGIvc3JjL2h0dHAvbW9kdWxlcy9wcm94eS9uZ3hfaHR0cF9wcm94eV9oYW5kbGVyLmMKQEAgLTM2LDYgKzM2LDggQEAKIHN0YXRpYyBjaGFyICpuZ3hfaHR0cF9wcm94eV9wYXJzZV91cHN0cmVhbShuZ3hfc3RyX3QgKnVybCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9wcm94eV91cHN0cmVhbV9jb25mX3QgKnUpOwogCitzdGF0aWMgY2hhciAqbmd4X2h0dHBfcHJveHlfc2V0X3hfdmFyKG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNvbmYpOwogc3RhdGljIGNoYXIgKm5neF9odHRwX3Byb3h5X2xvd2F0X2NoZWNrKG5neF9jb25mX3QgKmNmLCB2b2lkICpwb3N0LCB2b2lkICpkYXRhKTsKIAogc3RhdGljIG5neF9jb25mX3Bvc3RfdCAgbmd4X2h0dHBfcHJveHlfbG93YXRfcG9zdCA9CkBAIC0xMTksNiArMTIxLDEzIEBACiAgICAgICBvZmZzZXRvZihuZ3hfaHR0cF9wcm94eV9sb2NfY29uZl90LCBzZXRfeF9yZWFsX2lwKSwKICAgICAgIE5VTEwgfSwKIAorICAgIHsgbmd4X3N0cmluZygicHJveHlfc2V0X3hfdmFyIiksCisgICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0NPTkZfVEFLRTEsCisgICAgICBuZ3hfaHR0cF9wcm94eV9zZXRfeF92YXIsCisgICAgICBOR1hfSFRUUF9MT0NfQ09ORl9PRkZTRVQsCisgICAgICAwLAorICAgICAgTlVMTCB9LAorCiAgICAgeyBuZ3hfc3RyaW5nKCJwcm94eV9hZGRfeF9mb3J3YXJkZWRfZm9yIiksCiAgICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0NPTkZfRkxBRywKICAgICAgIG5neF9jb25mX3NldF9mbGFnX3Nsb3QsCkBAIC0xMDYzLDkgKzEwNzIsOSBAQAogewogICAgIG5neF9odHRwX3Byb3h5X2xvY19jb25mX3QgICpjb25mOwogCi0gICAgbmd4X3Rlc3RfbnVsbChjb25mLAotICAgICAgICAgICAgICAgICAgbmd4X3BjYWxsb2MoY2YtPnBvb2wsIHNpemVvZihuZ3hfaHR0cF9wcm94eV9sb2NfY29uZl90KSksCi0gICAgICAgICAgICAgICAgICBOR1hfQ09ORl9FUlJPUik7CisgICAgaWYgKCEoY29uZiA9IG5neF9wY2FsbG9jKGNmLT5wb29sLCBzaXplb2Yobmd4X2h0dHBfcHJveHlfbG9jX2NvbmZfdCkpKSkgeworICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgfQogCiAgICAgLyoKICAgICAgKiBzZXQgYnkgbmd4X3BjYWxsb2MoKToKQEAgLTEwNzgsNiArMTA4Nyw3IEBACiAgICAgICogICAgY29uZi0+cGVlcnMgPSBOVUxMOwogICAgICAqICAgIGNvbmYtPmNhY2hlX3BhdGggPSBOVUxMOwogICAgICAqICAgIGNvbmYtPnRlbXBfcGF0aCA9IE5VTEw7CisgICAgICogICAgY29uZi0+eF92YXJzOwogICAgICAqICAgIGNvbmYtPmJ1c3lfbG9jayA9IE5VTEw7CiAgICAgICovCiAKQEAgLTEzMDUsNiArMTMxNSw4IEBACiAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICB9CiAKKyAgICBsY2YtPnVwc3RyZWFtLT51cmwgPSAqdXJsOworCiAgICAgaWYgKG5neF9zdHJuY2FzZWNtcCh1cmwtPmRhdGEgKyA3LCAidW5peDoiLCA1KSA9PSAwKSB7CiAKICNpZiAoTkdYX0hBVkVfVU5JWF9ET01BSU4pCkBAIC0xMzY3LDYgKzEzNzksNDcgQEAKIH0KIAogCitzdGF0aWMgY2hhciAqbmd4X2h0dHBfcHJveHlfc2V0X3hfdmFyKG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNvbmYpCit7CisgICAgbmd4X2h0dHBfcHJveHlfbG9jX2NvbmZfdCAqbGNmID0gY29uZjsKKworICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICBpLCAqaW5kZXg7CisgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgKnZhbHVlOworICAgIG5neF9odHRwX3ZhcmlhYmxlX3QgICAgICAgICp2YXI7CisgICAgbmd4X2h0dHBfY29yZV9tYWluX2NvbmZfdCAgKmNtY2Y7CisKKyAgICBpZiAobGNmLT54X3ZhcnMuZWx0cyA9PSBOVUxMKSB7CisgICAgICAgIGlmIChuZ3hfYXJyYXlfaW5pdCgmbGNmLT54X3ZhcnMsIGNmLT5wb29sLCA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5neF9odHRwX3ZhcmlhYmxlX3QgKikpID09IE5HWF9FUlJPUikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgICAgICB9CisgICAgfQorCisgICAgY21jZiA9IG5neF9odHRwX2NvbmZfZ2V0X21vZHVsZV9tYWluX2NvbmYoY2YsIG5neF9odHRwX2NvcmVfbW9kdWxlKTsKKworICAgIHZhbHVlID0gY2YtPmFyZ3MtPmVsdHM7CisKKyAgICB2YXIgPSBjbWNmLT52YXJpYWJsZXMuZWx0czsKKyAgICBmb3IgKGkgPSAwOyBpIDwgY21jZi0+dmFyaWFibGVzLm5lbHRzOyBpKyspIHsKKyAgICAgICAgaWYgKG5neF9zdHJjYXNlY21wKHZhcltpXS5uYW1lLmRhdGEsIHZhbHVlWzFdLmRhdGEpID09IDApIHsKKworICAgICAgICAgICAgaWYgKCEoaW5kZXggPSBuZ3hfYXJyYXlfcHVzaCgmbGNmLT54X3ZhcnMpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgKmluZGV4ID0gdmFyW2ldLmluZGV4OworICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX09LOworICAgICAgICB9CisgICAgfQorCisgICAgbmd4X2NvbmZfbG9nX2Vycm9yKE5HWF9MT0dfRU1FUkcsIGNmLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAidW5rbm93biB2YXJpYWJsZSBuYW1lIFwiJVZcIiIsICZ2YWx1ZVsxXSk7CisgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworfQorCisKIHN0YXRpYyBjaGFyICpuZ3hfaHR0cF9wcm94eV9sb3dhdF9jaGVjayhuZ3hfY29uZl90ICpjZiwgdm9pZCAqcG9zdCwgdm9pZCAqZGF0YSkKIHsKICNpZiAoTkdYX0ZSRUVCU0QpCmRpZmYgLS1naXQgYS9zcmMvaHR0cC9tb2R1bGVzL3Byb3h5L25neF9odHRwX3Byb3h5X2hhbmRsZXIuaCBiL3NyYy9odHRwL21vZHVsZXMvcHJveHkvbmd4X2h0dHBfcHJveHlfaGFuZGxlci5oCmluZGV4IDRkZDk3YzIuLjI4ZDc5NzEgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL21vZHVsZXMvcHJveHkvbmd4X2h0dHBfcHJveHlfaGFuZGxlci5oCisrKyBiL3NyYy9odHRwL21vZHVsZXMvcHJveHkvbmd4X2h0dHBfcHJveHlfaGFuZGxlci5oCkBAIC04Nyw2ICs4Nyw4IEBACiAgICAgbmd4X3BhdGhfdCAgICAgICAgICAgICAgICAgICAgICAqY2FjaGVfcGF0aDsKICAgICBuZ3hfcGF0aF90ICAgICAgICAgICAgICAgICAgICAgICp0ZW1wX3BhdGg7CiAKKyAgICBuZ3hfYXJyYXlfdCAgICAgICAgICAgICAgICAgICAgICB4X3ZhcnM7CisKICAgICBuZ3hfaHR0cF9idXN5X2xvY2tfdCAgICAgICAgICAgICpidXN5X2xvY2s7CiAKICAgICBuZ3hfaHR0cF9wcm94eV91cHN0cmVhbV9jb25mX3QgICp1cHN0cmVhbTsKZGlmZiAtLWdpdCBhL3NyYy9odHRwL21vZHVsZXMvcHJveHkvbmd4X2h0dHBfcHJveHlfdXBzdHJlYW0uYyBiL3NyYy9odHRwL21vZHVsZXMvcHJveHkvbmd4X2h0dHBfcHJveHlfdXBzdHJlYW0uYwppbmRleCA0ZGZkNGU2Li5jZjUxOTUzIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9tb2R1bGVzL3Byb3h5L25neF9odHRwX3Byb3h5X3Vwc3RyZWFtLmMKKysrIGIvc3JjL2h0dHAvbW9kdWxlcy9wcm94eS9uZ3hfaHR0cF9wcm94eV91cHN0cmVhbS5jCkBAIC04NiwxMyArODYsMTUgQEAKIHN0YXRpYyBuZ3hfY2hhaW5fdCAqbmd4X2h0dHBfcHJveHlfY3JlYXRlX3JlcXVlc3Qobmd4X2h0dHBfcHJveHlfY3R4X3QgKnApCiB7CiAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuOwotICAgIG5neF9pbnRfdCAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZTsKLSAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgICAgICBpOworICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICAgICAgIGksIGVzY2FwZSwgKmluZGV4OwogICAgIG5neF9idWZfdCAgICAgICAgICAgICAgICAgICAgICAgKmI7CiAgICAgbmd4X2NoYWluX3QgICAgICAgICAgICAgICAgICAgICAqY2hhaW47CiAgICAgbmd4X2xpc3RfcGFydF90ICAgICAgICAgICAgICAgICAqcGFydDsKICAgICBuZ3hfdGFibGVfZWx0X3QgICAgICAgICAgICAgICAgICpoZWFkZXI7CiAgICAgbmd4X2h0dHBfcmVxdWVzdF90ICAgICAgICAgICAgICAqcjsKKyAgICBuZ3hfaHR0cF92YXJpYWJsZV90ICAgICAgICAgICAgICp2YXI7CisgICAgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAgICAgICAqdmFsdWU7CisgICAgbmd4X2h0dHBfY29yZV9tYWluX2NvbmZfdCAgICAgICAqY21jZjsKICAgICBuZ3hfaHR0cF9wcm94eV91cHN0cmVhbV9jb25mX3QgICp1YzsKIAogICAgIHIgPSBwLT5yZXF1ZXN0OwpAQCAtMTE1LDE4ICsxMTcsMTggQEAKIAogICAgIGxlbiArPSB1Yy0+dXJpLmxlbgogICAgICAgICArIHItPnVyaS5sZW4gLSB1Yy0+bG9jYXRpb24tPmxlbiArIGVzY2FwZQotICAgICAgICArIDEgKyByLT5hcmdzLmxlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMSBpcyBmb3IgIj8iICovCisgICAgICAgICsgc2l6ZW9mKCI/IikgLSAxICsgci0+YXJncy5sZW4KICAgICAgICAgKyBzaXplb2YoaHR0cF92ZXJzaW9uKSAtIDEKICAgICAgICAgKyBzaXplb2YoY29ubmVjdGlvbl9jbG9zZV9oZWFkZXIpIC0gMQotICAgICAgICArIDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMiBpcyBmb3IgIlxyXG4iIGF0IHRoZSBoZWFkZXIgZW5kICovCisgICAgICAgICsgc2l6ZW9mKENSTEYpIC0gMTsKIAogCiAgICAgaWYgKHAtPmxjZi0+c2V0X3hfdXJsKSB7CiAgICAgICAgIGxlbiArPSBzaXplb2YoeF91cmxfaGVhZGVyKSAtIDEKLSAgICAgICAgICAgICsgNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQgaXMgZm9yICJzOi8vIiAqLworICAgICAgICAgICAgKyBzaXplb2YoInM6Ly8iKSAtIDEKICAgICAgICAgICAgICsgci0+cG9ydF90ZXh0LT5sZW4KICAgICAgICAgICAgICsgci0+dW5wYXJzZWRfdXJpLmxlbgotICAgICAgICAgICAgKyAyOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIDIgaXMgZm9yICJcclxuIiBhdCB0aGUgaGVhZGVyIGVuZCAqLworICAgICAgICAgICAgKyBzaXplb2YoQ1JMRikgLSAxOwogCiAgICAgICAgIGlmIChyLT5oZWFkZXJzX2luLmhvc3QpIHsKICAgICAgICAgICAgIGxlbiArPSByLT5oZWFkZXJzX2luLmhvc3RfbmFtZV9sZW47CkBAIC0xNDAsMTcgKzE0MiwxNyBAQAogCiAgICAgaWYgKHAtPmxjZi0+cHJlc2VydmVfaG9zdCAmJiByLT5oZWFkZXJzX2luLmhvc3QpIHsKICAgICAgICAgbGVuICs9IHNpemVvZihob3N0X2hlYWRlcikgLSAxCi0gICAgICAgICAgICArIHItPmhlYWRlcnNfaW4uaG9zdF9uYW1lX2xlbgotICAgICAgICAgICAgKyAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEgaXMgZm9yICI6IiAqLwotICAgICAgICAgICAgKyB1Yy0+cG9ydF90ZXh0LmxlbgotICAgICAgICAgICAgKyAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDIgaXMgZm9yICJcclxuIiAqLwotICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDIgaXMgZm9yICJcclxuIiAqLwotICAgICAgICBsZW4gKz0gc2l6ZW9mKGhvc3RfaGVhZGVyKSAtIDEgKyB1Yy0+aG9zdF9oZWFkZXIubGVuICsgMjsKKyAgICAgICAgICAgICsgci0+aGVhZGVyc19pbi5ob3N0X25hbWVfbGVuICsgc2l6ZW9mKCI6IikgLSAxICsgdWMtPnBvcnRfdGV4dC5sZW4KKyAgICAgICAgICAgICsgc2l6ZW9mKENSTEYpIC0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBsZW4gKz0gc2l6ZW9mKGhvc3RfaGVhZGVyKSAtIDEgKyB1Yy0+aG9zdF9oZWFkZXIubGVuCisgICAgICAgICAgICArIHNpemVvZihDUkxGKSAtIDE7CiAgICAgfQogCiAKLSAgICBpZiAocC0+bGNmLT5zZXRfeF9yZWFsX2lwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyIGlzIGZvciAiXHJcbiIgKi8KLSAgICAgICAgbGVuICs9IHNpemVvZih4X3JlYWxfaXBfaGVhZGVyKSAtIDEgKyBJTkVUX0FERFJTVFJMRU4gLSAxICsgMjsKKyAgICBpZiAocC0+bGNmLT5zZXRfeF9yZWFsX2lwKSB7CisgICAgICAgIGxlbiArPSBzaXplb2YoeF9yZWFsX2lwX2hlYWRlcikgLSAxICsgSU5FVF9BRERSU1RSTEVOIC0gMQorICAgICAgICAgICAgKyBzaXplb2YoQ1JMRikgLSAxOwogICAgIH0KIAogCkBAIC0xNTgsMTIgKzE2MCwyOSBAQAogICAgICAgICBpZiAoci0+aGVhZGVyc19pbi54X2ZvcndhcmRlZF9mb3IpIHsKICAgICAgICAgICAgIGxlbiArPSBzaXplb2YoeF9mb3J3YXJkZWRfZm9yX2hlYWRlcikgLSAxCiAgICAgICAgICAgICAgICAgKyByLT5oZWFkZXJzX2luLnhfZm9yd2FyZGVkX2Zvci0+dmFsdWUubGVuCi0gICAgICAgICAgICAgICAgKyAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyIGlzIG9mciAiLCAiICovCi0gICAgICAgICAgICAgICAgKyBJTkVUX0FERFJTVFJMRU4gLSAxCi0gICAgICAgICAgICAgICAgKyAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMiBpcyBmb3IgIlxyXG4iICovCisgICAgICAgICAgICAgICAgKyBzaXplb2YoIiwgIikgLSAxICsgSU5FVF9BRERSU1RSTEVOIC0gMSArIHNpemVvZihDUkxGKSAtIDE7CisKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxlbiArPSBzaXplb2YoeF9mb3J3YXJkZWRfZm9yX2hlYWRlcikgLSAxICsgSU5FVF9BRERSU1RSTEVOIC0gMSArIDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMiBpcyBmb3IgIlxyXG4iICovCisgICAgICAgICAgICBsZW4gKz0gc2l6ZW9mKHhfZm9yd2FyZGVkX2Zvcl9oZWFkZXIpIC0gMSArIElORVRfQUREUlNUUkxFTiAtIDEKKyAgICAgICAgICAgICAgICArIHNpemVvZihDUkxGKSAtIDE7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIGNtY2YgPSBuZ3hfaHR0cF9nZXRfbW9kdWxlX21haW5fY29uZihyLCBuZ3hfaHR0cF9jb3JlX21vZHVsZSk7CisKKyAgICB2YXIgPSBjbWNmLT52YXJpYWJsZXMuZWx0czsKKyAgICBpbmRleCA9IHAtPmxjZi0+eF92YXJzLmVsdHM7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcC0+bGNmLT54X3ZhcnMubmVsdHM7IGkrKykgeworCisgICAgICAgIGlmICghKHZhbHVlID0gbmd4X2h0dHBfZ2V0X3ZhcmlhYmxlKHIsIGluZGV4W2ldKSkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHZhbHVlLT50ZXh0LmxlbikgeworICAgICAgICAgICAgbGVuICs9IHNpemVvZigiWC0iKSAtIDEgKyB2YXJbaW5kZXhbaV1dLm5hbWUubGVuICsgc2l6ZW9mKCI6ICIpIC0gMQorICAgICAgICAgICAgICAgICsgdmFsdWUtPnRleHQubGVuICsgc2l6ZW9mKENSTEYpIC0gMTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTkxLDE2ICsyMTAsMjQgQEAKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKLSAgICAgICAgLyogMiBpcyBmb3IgIjogIiBhbmQgMiBpcyBmb3IgIlxyXG4iICovCi0gICAgICAgIGxlbiArPSBoZWFkZXJbaV0ua2V5LmxlbiArIDIgKyBoZWFkZXJbaV0udmFsdWUubGVuICsgMjsKKyAgICAgICAgbGVuICs9IGhlYWRlcltpXS5rZXkubGVuICsgc2l6ZW9mKCI6ICIpIC0gMQorICAgICAgICAgICAgKyBoZWFkZXJbaV0udmFsdWUubGVuICsgc2l6ZW9mKENSTEYpIC0gMTsKICAgICB9CiAKICNpZiAoTkdYX0RFQlVHKQogICAgIGxlbisrOwogI2VuZGlmCiAKLSAgICBuZ3hfdGVzdF9udWxsKGIsIG5neF9jcmVhdGVfdGVtcF9idWYoci0+cG9vbCwgbGVuKSwgTlVMTCk7Ci0gICAgbmd4X2FsbG9jX2xpbmtfYW5kX3NldF9idWYoY2hhaW4sIGIsIHItPnBvb2wsIE5VTEwpOworICAgIGlmICghKGIgPSBuZ3hfY3JlYXRlX3RlbXBfYnVmKHItPnBvb2wsIGxlbikpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmICghKGNoYWluID0gbmd4X2FsbG9jX2NoYWluX2xpbmsoci0+cG9vbCkpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGNoYWluLT5idWYgPSBiOworICAgIGNoYWluLT5uZXh0ID0gTlVMTDsKIAogCiAgICAgLyogdGhlIHJlcXVlc3QgbGluZSAqLwpAQCAtMjI3LDcgKzI1NCw3IEBACiAgICAgfQogCiAgICAgaWYgKHItPmFyZ3MubGVuID4gMCkgewotICAgICAgICAqKGItPmxhc3QrKykgPSAnPyc7CisgICAgICAgICpiLT5sYXN0KysgPSAnPyc7CiAgICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsIHItPmFyZ3MuZGF0YSwgci0+YXJncy5sZW4pOwogICAgIH0KIApAQCAtMjQ5LDcgKzI3Niw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHItPmhlYWRlcnNfaW4uaG9zdF9uYW1lX2xlbik7CiAKICAgICAgICAgaWYgKCF1Yy0+ZGVmYXVsdF9wb3J0KSB7Ci0gICAgICAgICAgICAqKGItPmxhc3QrKykgPSAnOic7CisgICAgICAgICAgICAqYi0+bGFzdCsrID0gJzonOwogICAgICAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgdWMtPnBvcnRfdGV4dC5kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWMtPnBvcnRfdGV4dC5sZW4pOwogICAgICAgICB9CkBAIC0yNTgsNyArMjg1LDcgQEAKICAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgdWMtPmhvc3RfaGVhZGVyLmRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjLT5ob3N0X2hlYWRlci5sZW4pOwogICAgIH0KLSAgICAqKGItPmxhc3QrKykgPSBDUjsgKihiLT5sYXN0KyspID0gTEY7CisgICAgKmItPmxhc3QrKyA9IENSOyAqYi0+bGFzdCsrID0gTEY7CiAKIAogICAgIC8qIHRoZSAiWC1VUkwiIGhlYWRlciAqLwpAQCAtMjcxLDEyICsyOTgsMTIgQEAKICNpZiAoTkdYX09QRU5TU0wpCiAKICAgICAgICAgaWYgKHItPmNvbm5lY3Rpb24tPnNzbCkgewotICAgICAgICAgICAgKihiLT5sYXN0KyspID0gJ3MnOworICAgICAgICAgICAgKmItPmxhc3QrKyA9ICdzJzsKICAgICAgICAgfQogCiAjZW5kaWYKIAotICAgICAgICAqKGItPmxhc3QrKykgPSAnOic7ICooYi0+bGFzdCsrKSA9ICcvJzsgKihiLT5sYXN0KyspID0gJy8nOworICAgICAgICAqYi0+bGFzdCsrID0gJzonOyAqYi0+bGFzdCsrID0gJy8nOyAqYi0+bGFzdCsrID0gJy8nOwogCiAgICAgICAgIGlmIChyLT5oZWFkZXJzX2luLmhvc3QpIHsKICAgICAgICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsIHItPmhlYWRlcnNfaW4uaG9zdC0+dmFsdWUuZGF0YSwKQEAgLTI5MCw3ICszMTcsNyBAQAogICAgICAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCByLT51bnBhcnNlZF91cmkuZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+dW5wYXJzZWRfdXJpLmxlbik7CiAKLSAgICAgICAgKihiLT5sYXN0KyspID0gQ1I7ICooYi0+bGFzdCsrKSA9IExGOworICAgICAgICAqYi0+bGFzdCsrID0gQ1I7ICpiLT5sYXN0KysgPSBMRjsKICAgICB9CiAKIApAQCAtMzAxLDcgKzMyOCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih4X3JlYWxfaXBfaGVhZGVyKSAtIDEpOwogICAgICAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCByLT5jb25uZWN0aW9uLT5hZGRyX3RleHQuZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+Y29ubmVjdGlvbi0+YWRkcl90ZXh0Lmxlbik7Ci0gICAgICAgICooYi0+bGFzdCsrKSA9IENSOyAqKGItPmxhc3QrKykgPSBMRjsKKyAgICAgICAgKmItPmxhc3QrKyA9IENSOyAqYi0+bGFzdCsrID0gTEY7CiAgICAgfQogCiAKQEAgLTMxNiw3ICszNDMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+aGVhZGVyc19pbi54X2ZvcndhcmRlZF9mb3ItPnZhbHVlLmRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLT5oZWFkZXJzX2luLnhfZm9yd2FyZGVkX2Zvci0+dmFsdWUubGVuKTsKIAotICAgICAgICAgICAgKihiLT5sYXN0KyspID0gJywnOyAqKGItPmxhc3QrKykgPSAnICc7CisgICAgICAgICAgICAqYi0+bGFzdCsrID0gJywnOyAqYi0+bGFzdCsrID0gJyAnOwogCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCB4X2ZvcndhcmRlZF9mb3JfaGVhZGVyLApAQCAtMzI1LDcgKzM1MiwzMCBAQAogCiAgICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsIHItPmNvbm5lY3Rpb24tPmFkZHJfdGV4dC5kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLT5jb25uZWN0aW9uLT5hZGRyX3RleHQubGVuKTsKLSAgICAgICAgKihiLT5sYXN0KyspID0gQ1I7ICooYi0+bGFzdCsrKSA9IExGOworICAgICAgICAqYi0+bGFzdCsrID0gQ1I7ICpiLT5sYXN0KysgPSBMRjsKKyAgICB9CisKKworICAgIGZvciAoaSA9IDA7IGkgPCBwLT5sY2YtPnhfdmFycy5uZWx0czsgaSsrKSB7CisKKyAgICAgICAgaWYgKCEodmFsdWUgPSBuZ3hfaHR0cF9nZXRfdmFyaWFibGUociwgaW5kZXhbaV0pKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAodmFsdWUtPnRleHQubGVuID09IDApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgKmItPmxhc3QrKyA9ICdYJzsgKmItPmxhc3QrKyA9ICctJzsKKworICAgICAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCB2YXJbaW5kZXhbaV1dLm5hbWUuZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyW2luZGV4W2ldXS5uYW1lLmxlbik7CisKKyAgICAgICAgKmItPmxhc3QrKyA9ICc6JzsgKmItPmxhc3QrKyA9ICcgJzsKKworICAgICAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCB2YWx1ZS0+dGV4dC5kYXRhLCB2YWx1ZS0+dGV4dC5sZW4pOworCisgICAgICAgICpiLT5sYXN0KysgPSBDUjsgKmItPmxhc3QrKyA9IExGOwogICAgIH0KIAogCkBAIC0zNzIsMTIgKzQyMiwxMiBAQAogCiAgICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsIGhlYWRlcltpXS5rZXkuZGF0YSwgaGVhZGVyW2ldLmtleS5sZW4pOwogCi0gICAgICAgICooYi0+bGFzdCsrKSA9ICc6JzsgKihiLT5sYXN0KyspID0gJyAnOworICAgICAgICAqYi0+bGFzdCsrID0gJzonOyAqYi0+bGFzdCsrID0gJyAnOwogCiAgICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsIGhlYWRlcltpXS52YWx1ZS5kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaV0udmFsdWUubGVuKTsKIAotICAgICAgICAqKGItPmxhc3QrKykgPSBDUjsgKihiLT5sYXN0KyspID0gTEY7CisgICAgICAgICpiLT5sYXN0KysgPSBDUjsgKmItPmxhc3QrKyA9IExGOwogCiAgICAgICAgIG5neF9sb2dfZGVidWcyKE5HWF9MT0dfREVCVUdfSFRUUCwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAiaHR0cCBwcm94eSBoZWFkZXI6IFwiJVY6ICVWXCIiLApAQCAtMzg1LDEwICs0MzUsMTAgQEAKICAgICB9CiAKICAgICAvKiBhZGQgIlxyXG4iIGF0IHRoZSBoZWFkZXIgZW5kICovCi0gICAgKihiLT5sYXN0KyspID0gQ1I7ICooYi0+bGFzdCsrKSA9IExGOworICAgICpiLT5sYXN0KysgPSBDUjsgKmItPmxhc3QrKyA9IExGOwogCiAjaWYgKE5HWF9ERUJVRykKLSAgICAqKGItPmxhc3QpID0gJ1wwJzsKKyAgICAqYi0+bGFzdCA9ICdcMCc7CiAgICAgbmd4X2xvZ19kZWJ1ZzEoTkdYX0xPR19ERUJVR19IVFRQLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCiAgICAgICAgICAgICAgICAgICAgImh0dHAgcHJveHkgaGVhZGVyOlxuXCIlc1wiIiwgYi0+cG9zKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbmd4X2h0dHAuYyBiL3NyYy9odHRwL25neF9odHRwLmMKaW5kZXggMjFkMmU1NS4uMjZmMWNiNCAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbmd4X2h0dHAuYworKysgYi9zcmMvaHR0cC9uZ3hfaHR0cC5jCkBAIC0yNiw3ICsyNiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX21vZHVsZV90ICptb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF91aW50X3QgY3R4X2luZGV4KTsKIAotaW50ICAgICAgICAgbmd4X2h0dHBfbWF4X21vZHVsZTsKK25neF91aW50X3QgIG5neF9odHRwX21heF9tb2R1bGU7CiAKIG5neF91aW50X3QgIG5neF9odHRwX3RvdGFsX3JlcXVlc3RzOwogdWludDY0X3QgICAgbmd4X2h0dHBfdG90YWxfc2VudDsKQEAgLTg5LDE5ICs4OSwyMCBAQAogI2VuZGlmCiAKICNpZiAoTkdYX1NVUFBSRVNTX1dBUk4pCi0gICAgLyogTVNWQyB0aGlua3MgJ2luX3BvcnRzJyBtYXkgYmUgdXNlZCB3aXRob3V0IGhhdmluZyBiZWVuIGluaXRpYWxpemVkICovCisgICAgLyogTVNWQyB0aGlua3MgImluX3BvcnRzIiBtYXkgYmUgdXNlZCB3aXRob3V0IGhhdmluZyBiZWVuIGluaXRpYWxpemVkICovCiAgICAgbmd4X21lbXplcm8oJmluX3BvcnRzLCBzaXplb2Yobmd4X2FycmF5X3QpKTsKICNlbmRpZgogCiAKICAgICAvKiB0aGUgbWFpbiBodHRwIGNvbnRleHQgKi8KIAotICAgIG5neF90ZXN0X251bGwoY3R4LAotICAgICAgICAgICAgICAgICAgbmd4X3BjYWxsb2MoY2YtPnBvb2wsIHNpemVvZihuZ3hfaHR0cF9jb25mX2N0eF90KSksCi0gICAgICAgICAgICAgICAgICBOR1hfQ09ORl9FUlJPUik7CisgICAgaWYgKCEoY3R4ID0gbmd4X3BjYWxsb2MoY2YtPnBvb2wsIHNpemVvZihuZ3hfaHR0cF9jb25mX2N0eF90KSkpKSB7CisgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICB9CiAKICAgICAqKG5neF9odHRwX2NvbmZfY3R4X3QgKiopIGNvbmYgPSBjdHg7CiAKKwogICAgIC8qIGNvdW50IHRoZSBudW1iZXIgb2YgdGhlIGh0dHAgbW9kdWxlcyBhbmQgc2V0IHVwIHRoZWlyIGluZGljZXMgKi8KIAogICAgIG5neF9odHRwX21heF9tb2R1bGUgPSAwOwpAQCAtMTEzLDI0ICsxMTQsNDIgQEAKICAgICAgICAgbmd4X21vZHVsZXNbbV0tPmN0eF9pbmRleCA9IG5neF9odHRwX21heF9tb2R1bGUrKzsKICAgICB9CiAKLSAgICAvKiB0aGUgbWFpbiBodHRwIG1haW5fY29uZiwgaXQncyB0aGUgc2FtZSBpbiB0aGUgYWxsIGh0dHAgY29udGV4dHMgKi8KIAotICAgIG5neF90ZXN0X251bGwoY3R4LT5tYWluX2NvbmYsCi0gICAgICAgICAgICAgICAgICBuZ3hfcGNhbGxvYyhjZi0+cG9vbCwgc2l6ZW9mKHZvaWQgKikgKiBuZ3hfaHR0cF9tYXhfbW9kdWxlKSwKLSAgICAgICAgICAgICAgICAgIE5HWF9DT05GX0VSUk9SKTsKKyAgICAvKiB0aGUgaHR0cCBtYWluX2NvbmYgY29udGV4dCwgaXQgaXMgdGhlIHNhbWUgaW4gdGhlIGFsbCBodHRwIGNvbnRleHRzICovCiAKLSAgICAvKiB0aGUgaHR0cCBudWxsIHNydl9jb25mLCBpdCdzIHVzZWQgdG8gbWVyZ2UgdGhlIHNlcnZlcnt9cycgc3J2X2NvbmYncyAqLwotICAgIG5neF90ZXN0X251bGwoY3R4LT5zcnZfY29uZiwKLSAgICAgICAgICAgICAgICAgIG5neF9wY2FsbG9jKGNmLT5wb29sLCBzaXplb2Yodm9pZCAqKSAqIG5neF9odHRwX21heF9tb2R1bGUpLAotICAgICAgICAgICAgICAgICAgTkdYX0NPTkZfRVJST1IpOwotCi0gICAgLyogdGhlIGh0dHAgbnVsbCBsb2NfY29uZiwgaXQncyB1c2VkIHRvIG1lcmdlIHRoZSBzZXJ2ZXJ7fXMnIGxvY19jb25mJ3MgKi8KLSAgICBuZ3hfdGVzdF9udWxsKGN0eC0+bG9jX2NvbmYsCi0gICAgICAgICAgICAgICAgICBuZ3hfcGNhbGxvYyhjZi0+cG9vbCwgc2l6ZW9mKHZvaWQgKikgKiBuZ3hfaHR0cF9tYXhfbW9kdWxlKSwKLSAgICAgICAgICAgICAgICAgIE5HWF9DT05GX0VSUk9SKTsKKyAgICBjdHgtPm1haW5fY29uZiA9IG5neF9wY2FsbG9jKGNmLT5wb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHZvaWQgKikgKiBuZ3hfaHR0cF9tYXhfbW9kdWxlKTsKKyAgICBpZiAoY3R4LT5tYWluX2NvbmYgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgfQogCiAKLSAgICAvKiBjcmVhdGUgdGhlIG1haW5fY29uZiwgc3J2X2NvbmYgYW5kIGxvY19jb25mIGluIGFsbCBodHRwIG1vZHVsZXMgKi8KKyAgICAvKgorICAgICAqIHRoZSBodHRwIG51bGwgc3J2X2NvbmYgY29udGV4dCwgaXQgaXMgdXNlZCB0byBtZXJnZQorICAgICAqIHRoZSBzZXJ2ZXJ7fXMnIHNydl9jb25mJ3MKKyAgICAgKi8KKworICAgIGN0eC0+c3J2X2NvbmYgPSBuZ3hfcGNhbGxvYyhjZi0+cG9vbCwgc2l6ZW9mKHZvaWQgKikgKiBuZ3hfaHR0cF9tYXhfbW9kdWxlKTsKKyAgICBpZiAoY3R4LT5zcnZfY29uZiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICB9CisKKworICAgIC8qCisgICAgICogdGhlIGh0dHAgbnVsbCBsb2NfY29uZiBjb250ZXh0LCBpdCBpcyB1c2VkIHRvIG1lcmdlCisgICAgICogdGhlIHNlcnZlcnt9cycgbG9jX2NvbmYncworICAgICAqLworCisgICAgY3R4LT5sb2NfY29uZiA9IG5neF9wY2FsbG9jKGNmLT5wb29sLCBzaXplb2Yodm9pZCAqKSAqIG5neF9odHRwX21heF9tb2R1bGUpOworICAgIGlmIChjdHgtPmxvY19jb25mID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBjcmVhdGUgdGhlIG1haW5fY29uZidzLCB0aGUgbnVsbCBzcnZfY29uZidzLCBhbmQgdGhlIG51bGwgbG9jX2NvbmYncworICAgICAqIG9mIHRoZSBhbGwgaHR0cCBtb2R1bGVzCisgICAgICovCiAKICAgICBmb3IgKG0gPSAwOyBuZ3hfbW9kdWxlc1ttXTsgbSsrKSB7CiAgICAgICAgIGlmIChuZ3hfbW9kdWxlc1ttXS0+dHlwZSAhPSBOR1hfSFRUUF9NT0RVTEUpIHsKQEAgLTE0NywyMSArMTY2LDI1IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAobW9kdWxlLT5jcmVhdGVfbWFpbl9jb25mKSB7Ci0gICAgICAgICAgICBuZ3hfdGVzdF9udWxsKGN0eC0+bWFpbl9jb25mW21pXSwgbW9kdWxlLT5jcmVhdGVfbWFpbl9jb25mKGNmKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTkdYX0NPTkZfRVJST1IpOworICAgICAgICAgICAgaWYgKCEoY3R4LT5tYWluX2NvbmZbbWldID0gbW9kdWxlLT5jcmVhdGVfbWFpbl9jb25mKGNmKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBpZiAobW9kdWxlLT5jcmVhdGVfc3J2X2NvbmYpIHsKLSAgICAgICAgICAgIG5neF90ZXN0X251bGwoY3R4LT5zcnZfY29uZlttaV0sIG1vZHVsZS0+Y3JlYXRlX3Nydl9jb25mKGNmKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTkdYX0NPTkZfRVJST1IpOworICAgICAgICAgICAgaWYgKCEoY3R4LT5zcnZfY29uZlttaV0gPSBtb2R1bGUtPmNyZWF0ZV9zcnZfY29uZihjZikpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgaWYgKG1vZHVsZS0+Y3JlYXRlX2xvY19jb25mKSB7Ci0gICAgICAgICAgICBuZ3hfdGVzdF9udWxsKGN0eC0+bG9jX2NvbmZbbWldLCBtb2R1bGUtPmNyZWF0ZV9sb2NfY29uZihjZiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE5HWF9DT05GX0VSUk9SKTsKKyAgICAgICAgICAgIGlmICghKGN0eC0+bG9jX2NvbmZbbWldID0gbW9kdWxlLT5jcmVhdGVfbG9jX2NvbmYoY2YpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAorCiAgICAgLyogcGFyc2UgaW5zaWRlIHRoZSBodHRwe30gYmxvY2sgKi8KIAogICAgIHBjZiA9ICpjZjsKQEAgLTIzNiw1NyArMjU5LDU5IEBACiAgICAgICAgICAgICAgICAgICAgICpjZiA9IHBjZjsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJ2OwogICAgICAgICAgICAgICAgIH0KLQotI2lmIDAKLSAgICAgICAgICAgICAgICBjbGNmcCA9IChuZ3hfaHR0cF9jb3JlX2xvY19jb25mX3QgKiopIGNzY2ZwW3NdLT5sb2NhdGlvbnMuZWx0czsKLQotICAgICAgICAgICAgICAgIGZvciAobCA9IDA7IGwgPCBjc2NmcFtzXS0+bG9jYXRpb25zLm5lbHRzOyBsKyspIHsKLSAgICAgICAgICAgICAgICAgICAgcnYgPSBtb2R1bGUtPm1lcmdlX2xvY19jb25mKGNmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NjZnBbc10tPmN0eC0+bG9jX2NvbmZbbWldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xjZnBbbF0tPmxvY19jb25mW21pXSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChydiAhPSBOR1hfQ09ORl9PSykgewotICAgICAgICAgICAgICAgICAgICAgICAgKmNmID0gcGNmOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJ2OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotI2VuZGlmCiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvKiB3ZSBuZWVkZWQgImh0dHAiJ3MgY2YtPmN0eCB3aGlsZSBtZXJnaW5nIGNvbmZpZ3VyYXRpb24gKi8KKworICAgIC8qIHdlIG5lZWRlZCBodHRwe30ncyBjZi0+Y3R4IHdoaWxlIHRoZSBtZXJnaW5nIGNvbmZpZ3VyYXRpb24gKi8KICAgICAqY2YgPSBwY2Y7CiAKKwogICAgIC8qIGluaXQgbGlzdHMgb2YgdGhlIGhhbmRsZXJzICovCiAKLSAgICBuZ3hfaW5pdF9hcnJheShjbWNmLT5waGFzZXNbTkdYX0hUVFBfUkVXUklURV9QSEFTRV0uaGFuZGxlcnMsCi0gICAgICAgICAgICAgICAgICAgY2YtPmN5Y2xlLT5wb29sLCAxMCwgc2l6ZW9mKG5neF9odHRwX2hhbmRsZXJfcHQpLAotICAgICAgICAgICAgICAgICAgIE5HWF9DT05GX0VSUk9SKTsKKyAgICBpZiAobmd4X2FycmF5X2luaXQoJmNtY2YtPnBoYXNlc1tOR1hfSFRUUF9SRVdSSVRFX1BIQVNFXS5oYW5kbGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgY2YtPnBvb2wsIDEsIHNpemVvZihuZ3hfaHR0cF9oYW5kbGVyX3B0KSkgPT0gTkdYX0VSUk9SKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgIH0KKwogICAgIGNtY2YtPnBoYXNlc1tOR1hfSFRUUF9SRVdSSVRFX1BIQVNFXS50eXBlID0gTkdYX09LOwogCiAKLSAgICAvKiB0aGUgc3BlY2lhbCBmaW5kIGNvbmZpZyBwaGFzZSBmb3Igc2luZ2xlIGhhbmRsZXIgKi8KKyAgICAvKiB0aGUgc3BlY2lhbCBmaW5kIGNvbmZpZyBwaGFzZSBmb3IgYSBzaW5nbGUgaGFuZGxlciAqLwogCi0gICAgbmd4X2luaXRfYXJyYXkoY21jZi0+cGhhc2VzW05HWF9IVFRQX0ZJTkRfQ09ORklHX1BIQVNFXS5oYW5kbGVycywKLSAgICAgICAgICAgICAgICAgICBjZi0+Y3ljbGUtPnBvb2wsIDEsIHNpemVvZihuZ3hfaHR0cF9oYW5kbGVyX3B0KSwKLSAgICAgICAgICAgICAgICAgICBOR1hfQ09ORl9FUlJPUik7CisgICAgaWYgKG5neF9hcnJheV9pbml0KCZjbWNmLT5waGFzZXNbTkdYX0hUVFBfRklORF9DT05GSUdfUEhBU0VdLmhhbmRsZXJzLAorICAgICAgICAgICAgICAgICAgICAgICBjZi0+cG9vbCwgMSwgc2l6ZW9mKG5neF9odHRwX2hhbmRsZXJfcHQpKSA9PSBOR1hfRVJST1IpCisgICAgeworICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgfQorCiAgICAgY21jZi0+cGhhc2VzW05HWF9IVFRQX0ZJTkRfQ09ORklHX1BIQVNFXS50eXBlID0gTkdYX09LOwogCi0gICAgbmd4X3Rlc3RfbnVsbChoLCBuZ3hfcHVzaF9hcnJheSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZjbWNmLT5waGFzZXNbTkdYX0hUVFBfRklORF9DT05GSUdfUEhBU0VdLmhhbmRsZXJzKSwKLSAgICAgICAgICAgICAgICAgIE5HWF9DT05GX0VSUk9SKTsKKyAgICBoID0gbmd4X3B1c2hfYXJyYXkoJmNtY2YtPnBoYXNlc1tOR1hfSFRUUF9GSU5EX0NPTkZJR19QSEFTRV0uaGFuZGxlcnMpOworICAgIGlmIChoID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgIH0KKwogICAgICpoID0gbmd4X2h0dHBfZmluZF9sb2NhdGlvbl9jb25maWc7CiAKIAotICAgIG5neF9pbml0X2FycmF5KGNtY2YtPnBoYXNlc1tOR1hfSFRUUF9BQ0NFU1NfUEhBU0VdLmhhbmRsZXJzLAotICAgICAgICAgICAgICAgICAgIGNmLT5jeWNsZS0+cG9vbCwgMTAsIHNpemVvZihuZ3hfaHR0cF9oYW5kbGVyX3B0KSwKLSAgICAgICAgICAgICAgICAgICBOR1hfQ09ORl9FUlJPUik7CisgICAgaWYgKG5neF9hcnJheV9pbml0KCZjbWNmLT5waGFzZXNbTkdYX0hUVFBfQUNDRVNTX1BIQVNFXS5oYW5kbGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgY2YtPnBvb2wsIDEsIHNpemVvZihuZ3hfaHR0cF9oYW5kbGVyX3B0KSkgPT0gTkdYX0VSUk9SKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgIH0KKwogICAgIGNtY2YtPnBoYXNlc1tOR1hfSFRUUF9BQ0NFU1NfUEhBU0VdLnR5cGUgPSBOR1hfREVDTElORUQ7CiAKIAotICAgIG5neF9pbml0X2FycmF5KGNtY2YtPnBoYXNlc1tOR1hfSFRUUF9DT05URU5UX1BIQVNFXS5oYW5kbGVycywKLSAgICAgICAgICAgICAgICAgICBjZi0+Y3ljbGUtPnBvb2wsIDEwLCBzaXplb2Yobmd4X2h0dHBfaGFuZGxlcl9wdCksCi0gICAgICAgICAgICAgICAgICAgTkdYX0NPTkZfRVJST1IpOworICAgIGlmIChuZ3hfYXJyYXlfaW5pdCgmY21jZi0+cGhhc2VzW05HWF9IVFRQX0NPTlRFTlRfUEhBU0VdLmhhbmRsZXJzLAorICAgICAgICAgICAgICAgICAgICAgICBjZi0+cG9vbCwgNCwgc2l6ZW9mKG5neF9odHRwX2hhbmRsZXJfcHQpKSA9PSBOR1hfRVJST1IpCisgICAgeworICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgfQorCiAgICAgY21jZi0+cGhhc2VzW05HWF9IVFRQX0NPTlRFTlRfUEhBU0VdLnR5cGUgPSBOR1hfT0s7CiAKIApkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbmd4X2h0dHBfY29uZmlnLmggYi9zcmMvaHR0cC9uZ3hfaHR0cF9jb25maWcuaAppbmRleCBiZTAwNTJlLi44NWJlOTExIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9uZ3hfaHR0cF9jb25maWcuaAorKysgYi9zcmMvaHR0cC9uZ3hfaHR0cF9jb25maWcuaApAQCAtMzgsNiArMzgsOSBAQAogI2RlZmluZSBOR1hfSFRUUF9NQUlOX0NPTkYgICAgICAgIDB4MDIwMDAwMDAKICNkZWZpbmUgTkdYX0hUVFBfU1JWX0NPTkYgICAgICAgICAweDA0MDAwMDAwCiAjZGVmaW5lIE5HWF9IVFRQX0xPQ19DT05GICAgICAgICAgMHgwODAwMDAwMAorI2RlZmluZSBOR1hfSFRUUF9VUFNfQ09ORiAgICAgICAgIDB4MTAwMDAwMDAKKyNkZWZpbmUgTkdYX0hUVFBfU0lGX0NPTkYgICAgICAgICAweDIwMDAwMDAwCisjZGVmaW5lIE5HWF9IVFRQX0xJRl9DT05GICAgICAgICAgMHg4MDAwMDAwMAogCiAKICNkZWZpbmUgTkdYX0hUVFBfTUFJTl9DT05GX09GRlNFVCAgb2Zmc2V0b2Yobmd4X2h0dHBfY29uZl9jdHhfdCwgbWFpbl9jb25mKQpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbmd4X2h0dHBfY29yZV9tb2R1bGUuYyBiL3NyYy9odHRwL25neF9odHRwX2NvcmVfbW9kdWxlLmMKaW5kZXggYmY0NTVkOC4uMTBmY2I4NyAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbmd4X2h0dHBfY29yZV9tb2R1bGUuYworKysgYi9zcmMvaHR0cC9uZ3hfaHR0cF9jb3JlX21vZHVsZS5jCkBAIC0xNywxMCArMTcsMTAgQEAKICNkZWZpbmUgTkdYX0hUVFBfTE9DQVRJT05fUkVHRVggICAgICAgICAgIDQKIAogCi1zdGF0aWMgdm9pZCBuZ3hfaHR0cF9waGFzZV9ldmVudF9oYW5kbGVyKG5neF9ldmVudF90ICpyZXYpOwotc3RhdGljIHZvaWQgbmd4X2h0dHBfcnVuX3BoYXNlcyhuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpOwotc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9maW5kX2xvY2F0aW9uKG5neF9odHRwX3JlcXVlc3RfdCAqciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfYXJyYXlfdCAqbG9jYXRpb25zLCBzaXplX3QgbGVuKTsKK3N0YXRpYyB2b2lkIG5neF9odHRwX2NvcmVfcGhhc2VfZXZlbnRfaGFuZGxlcihuZ3hfZXZlbnRfdCAqcmV2KTsKK3N0YXRpYyB2b2lkIG5neF9odHRwX2NvcmVfcnVuX3BoYXNlcyhuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpOworc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9jb3JlX2ZpbmRfbG9jYXRpb24obmd4X2h0dHBfcmVxdWVzdF90ICpyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfYXJyYXlfdCAqbG9jYXRpb25zLCBzaXplX3QgbGVuKTsKIAogc3RhdGljIHZvaWQgKm5neF9odHRwX2NvcmVfY3JlYXRlX21haW5fY29uZihuZ3hfY29uZl90ICpjZik7CiBzdGF0aWMgY2hhciAqbmd4X2h0dHBfY29yZV9pbml0X21haW5fY29uZihuZ3hfY29uZl90ICpjZiwgdm9pZCAqY29uZik7CkBAIC0zMSwyMyArMzEsMzMgQEAKIHN0YXRpYyBjaGFyICpuZ3hfaHR0cF9jb3JlX21lcmdlX2xvY19jb25mKG5neF9jb25mX3QgKmNmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcGFyZW50LCB2b2lkICpjaGlsZCk7CiAKLXN0YXRpYyBjaGFyICpuZ3hfc2VydmVyX2Jsb2NrKG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpjbWQsIHZvaWQgKmR1bW15KTsKLXN0YXRpYyBpbnQgbmd4X2NtcF9sb2NhdGlvbnMoY29uc3Qgdm9pZCAqZmlyc3QsIGNvbnN0IHZvaWQgKnNlY29uZCk7Ci1zdGF0aWMgY2hhciAqbmd4X2xvY2F0aW9uX2Jsb2NrKG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpjbWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmR1bW15KTsKLXN0YXRpYyBjaGFyICpuZ3hfdHlwZXNfYmxvY2sobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwgdm9pZCAqY29uZik7Ci1zdGF0aWMgY2hhciAqbmd4X3NldF90eXBlKG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpkdW1teSwgdm9pZCAqY29uZik7Ci1zdGF0aWMgY2hhciAqbmd4X2h0dHBfbGlzdGVuKG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpjbWQsIHZvaWQgKmNvbmYpOwotc3RhdGljIGNoYXIgKm5neF9zZXRfc2VydmVyX25hbWUobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwKK3N0YXRpYyBjaGFyICpuZ3hfaHR0cF9jb3JlX3NlcnZlcihuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmR1bW15KTsKK3N0YXRpYyBjaGFyICpuZ3hfaHR0cF9jb3JlX2xvY2F0aW9uKG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkdW1teSk7CitzdGF0aWMgaW50IG5neF9odHRwX2NvcmVfY21wX2xvY2F0aW9ucyhjb25zdCB2b2lkICpmaXJzdCwgY29uc3Qgdm9pZCAqc2Vjb25kKTsKKworc3RhdGljIGNoYXIgKm5neF9odHRwX2NvcmVfdHlwZXMobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNvbmYpOwotc3RhdGljIGNoYXIgKm5neF9zZXRfcm9vdChuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLCB2b2lkICpjb25mKTsKLXN0YXRpYyBjaGFyICpuZ3hfc2V0X2Vycm9yX3BhZ2Uobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwgdm9pZCAqY29uZik7Ci1zdGF0aWMgY2hhciAqbmd4X3NldF9lcnJvcl9sb2cobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwgdm9pZCAqY29uZik7Ci1zdGF0aWMgY2hhciAqbmd4X3NldF9rZWVwYWxpdmUobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwgdm9pZCAqY29uZik7CitzdGF0aWMgY2hhciAqbmd4X2h0dHBfY29yZV90eXBlKG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpkdW1teSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY29uZik7CiAKLXN0YXRpYyBjaGFyICpuZ3hfaHR0cF9sb3dhdF9jaGVjayhuZ3hfY29uZl90ICpjZiwgdm9pZCAqcG9zdCwgdm9pZCAqZGF0YSk7CitzdGF0aWMgY2hhciAqbmd4X2h0dHBfY29yZV9saXN0ZW4obmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjb25mKTsKK3N0YXRpYyBjaGFyICpuZ3hfaHR0cF9jb3JlX3NlcnZlcl9uYW1lKG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjb25mKTsKK3N0YXRpYyBjaGFyICpuZ3hfaHR0cF9jb3JlX3Jvb3Qobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwgdm9pZCAqY29uZik7CitzdGF0aWMgY2hhciAqbmd4X2h0dHBfY29yZV9lcnJvcl9wYWdlKG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNvbmYpOworc3RhdGljIGNoYXIgKm5neF9odHRwX2NvcmVfZXJyb3JfbG9nKG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY29uZik7CitzdGF0aWMgY2hhciAqbmd4X2h0dHBfY29yZV9rZWVwYWxpdmUobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjb25mKTsKIAotc3RhdGljIG5neF9jb25mX3Bvc3RfdCAgbmd4X2h0dHBfbG93YXRfcG9zdCA9IHsgbmd4X2h0dHBfbG93YXRfY2hlY2sgfSA7CitzdGF0aWMgY2hhciAqbmd4X2h0dHBfY29yZV9sb3dhdF9jaGVjayhuZ3hfY29uZl90ICpjZiwgdm9pZCAqcG9zdCwgdm9pZCAqZGF0YSk7CisKK3N0YXRpYyBuZ3hfY29uZl9wb3N0X3QgIG5neF9odHRwX2NvcmVfbG93YXRfcG9zdCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBuZ3hfaHR0cF9jb3JlX2xvd2F0X2NoZWNrIH07CiAKIAogc3RhdGljIG5neF9jb25mX2VudW1fdCAgbmd4X2h0dHBfcmVzdHJpY3RfaG9zdF9uYW1lc1tdID0gewpAQCAtNzYsNyArODYsNyBAQAogCiAgICAgeyBuZ3hfc3RyaW5nKCJzZXJ2ZXIiKSwKICAgICAgIE5HWF9IVFRQX01BSU5fQ09ORnxOR1hfQ09ORl9CTE9DS3xOR1hfQ09ORl9OT0FSR1MsCi0gICAgICBuZ3hfc2VydmVyX2Jsb2NrLAorICAgICAgbmd4X2h0dHBfY29yZV9zZXJ2ZXIsCiAgICAgICAwLAogICAgICAgMCwKICAgICAgIE5VTEwgfSwKQEAgLTEzMiw3ICsxNDIsNyBAQAogCiAgICAgeyBuZ3hfc3RyaW5nKCJsb2NhdGlvbiIpLAogICAgICAgTkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0NPTkZfQkxPQ0t8TkdYX0NPTkZfVEFLRTEyLAotICAgICAgbmd4X2xvY2F0aW9uX2Jsb2NrLAorICAgICAgbmd4X2h0dHBfY29yZV9sb2NhdGlvbiwKICAgICAgIE5HWF9IVFRQX1NSVl9DT05GX09GRlNFVCwKICAgICAgIDAsCiAgICAgICBOVUxMIH0sCkBAIC0xNDMsMTQgKzE1MywxNCBAQAogI2Vsc2UKICAgICAgIE5HWF9IVFRQX1NSVl9DT05GfE5HWF9DT05GX1RBS0UxMiwKICNlbmRpZgotICAgICAgbmd4X2h0dHBfbGlzdGVuLAorICAgICAgbmd4X2h0dHBfY29yZV9saXN0ZW4sCiAgICAgICBOR1hfSFRUUF9TUlZfQ09ORl9PRkZTRVQsCiAgICAgICAwLAogICAgICAgTlVMTCB9LAogCiAgICAgeyBuZ3hfc3RyaW5nKCJzZXJ2ZXJfbmFtZSIpLAogICAgICAgTkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0NPTkZfMU1PUkUsCi0gICAgICBuZ3hfc2V0X3NlcnZlcl9uYW1lLAorICAgICAgbmd4X2h0dHBfY29yZV9zZXJ2ZXJfbmFtZSwKICAgICAgIE5HWF9IVFRQX1NSVl9DT05GX09GRlNFVCwKICAgICAgIDAsCiAgICAgICBOVUxMIH0sCkBAIC0xNTgsNyArMTY4LDcgQEAKICAgICB7IG5neF9zdHJpbmcoInR5cGVzIiksCiAgICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxOR1hfQ09ORl9CTE9DS3xOR1hfQ09ORl9OT0FSR1MsCi0gICAgICBuZ3hfdHlwZXNfYmxvY2ssCisgICAgICBuZ3hfaHR0cF9jb3JlX3R5cGVzLAogICAgICAgTkdYX0hUVFBfTE9DX0NPTkZfT0ZGU0VULAogICAgICAgMCwKICAgICAgIE5VTEwgfSwKQEAgLTE3MiwxNCArMTgyLDE0IEBACiAKICAgICB7IG5neF9zdHJpbmcoInJvb3QiKSwKICAgICAgIE5HWF9IVFRQX01BSU5fQ09ORnxOR1hfSFRUUF9TUlZfQ09ORnxOR1hfSFRUUF9MT0NfQ09ORnxOR1hfQ09ORl9UQUtFMSwKLSAgICAgIG5neF9zZXRfcm9vdCwKKyAgICAgIG5neF9odHRwX2NvcmVfcm9vdCwKICAgICAgIE5HWF9IVFRQX0xPQ19DT05GX09GRlNFVCwKICAgICAgIDAsCiAgICAgICBOVUxMIH0sCiAKICAgICB7IG5neF9zdHJpbmcoImFsaWFzIiksCiAgICAgICBOR1hfSFRUUF9MT0NfQ09ORnxOR1hfQ09ORl9UQUtFMSwKLSAgICAgIG5neF9zZXRfcm9vdCwKKyAgICAgIG5neF9odHRwX2NvcmVfcm9vdCwKICAgICAgIE5HWF9IVFRQX0xPQ19DT05GX09GRlNFVCwKICAgICAgIDAsCiAgICAgICBOVUxMIH0sCkBAIC0yNDUsNyArMjU1LDcgQEAKICAgICAgIG5neF9jb25mX3NldF9zaXplX3Nsb3QsCiAgICAgICBOR1hfSFRUUF9MT0NfQ09ORl9PRkZTRVQsCiAgICAgICBvZmZzZXRvZihuZ3hfaHR0cF9jb3JlX2xvY19jb25mX3QsIHNlbmRfbG93YXQpLAotICAgICAgJm5neF9odHRwX2xvd2F0X3Bvc3QgfSwKKyAgICAgICZuZ3hfaHR0cF9jb3JlX2xvd2F0X3Bvc3QgfSwKIAogICAgIHsgbmd4X3N0cmluZygicG9zdHBvbmVfb3V0cHV0IiksCiAgICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0NPTkZfVEFLRTEsCkBAIC0yNTUsNyArMjY1LDggQEAKICAgICAgIE5VTEwgfSwKIAogICAgIHsgbmd4X3N0cmluZygibGltaXRfcmF0ZSIpLAotICAgICAgTkdYX0hUVFBfTUFJTl9DT05GfE5HWF9IVFRQX1NSVl9DT05GfE5HWF9IVFRQX0xPQ19DT05GfE5HWF9DT05GX1RBS0UxLAorICAgICAgTkdYX0hUVFBfTUFJTl9DT05GfE5HWF9IVFRQX1NSVl9DT05GfE5HWF9IVFRQX0xPQ19DT05GfE5HWF9IVFRQX0xJRl9DT05GCisgICAgICAgICAgICAgICAgICAgICAgICB8TkdYX0NPTkZfVEFLRTEsCiAgICAgICBuZ3hfY29uZl9zZXRfc2l6ZV9zbG90LAogICAgICAgTkdYX0hUVFBfTE9DX0NPTkZfT0ZGU0VULAogICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfY29yZV9sb2NfY29uZl90LCBsaW1pdF9yYXRlKSwKQEAgLTI2Myw3ICsyNzQsNyBAQAogCiAgICAgeyBuZ3hfc3RyaW5nKCJrZWVwYWxpdmVfdGltZW91dCIpLAogICAgICAgTkdYX0hUVFBfTUFJTl9DT05GfE5HWF9IVFRQX1NSVl9DT05GfE5HWF9IVFRQX0xPQ19DT05GfE5HWF9DT05GX1RBS0UxMiwKLSAgICAgIG5neF9zZXRfa2VlcGFsaXZlLAorICAgICAgbmd4X2h0dHBfY29yZV9rZWVwYWxpdmUsCiAgICAgICBOR1hfSFRUUF9MT0NfQ09ORl9PRkZTRVQsCiAgICAgICAwLAogICAgICAgTlVMTCB9LApAQCAtMjk4LDE0ICszMDksMTQgQEAKIAogICAgIHsgbmd4X3N0cmluZygiZXJyb3JfcGFnZSIpLAogICAgICAgTkdYX0hUVFBfTUFJTl9DT05GfE5HWF9IVFRQX1NSVl9DT05GfE5HWF9IVFRQX0xPQ19DT05GfE5HWF9DT05GXzJNT1JFLAotICAgICAgbmd4X3NldF9lcnJvcl9wYWdlLAorICAgICAgbmd4X2h0dHBfY29yZV9lcnJvcl9wYWdlLAogICAgICAgTkdYX0hUVFBfTE9DX0NPTkZfT0ZGU0VULAogICAgICAgMCwKICAgICAgIE5VTEwgfSwKIAogICAgIHsgbmd4X3N0cmluZygiZXJyb3JfbG9nIiksCiAgICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0NPTkZfMU1PUkUsCi0gICAgICBuZ3hfc2V0X2Vycm9yX2xvZywKKyAgICAgIG5neF9odHRwX2NvcmVfZXJyb3JfbG9nLAogICAgICAgTkdYX0hUVFBfTE9DX0NPTkZfT0ZGU0VULAogICAgICAgMCwKICAgICAgIE5VTEwgfSwKQEAgLTM5OSwxNSArNDEwLDE4IEBACiAgICAgLyogVEVTVCBTVFVCICovIHItPmxpbmdlcmluZ19jbG9zZSA9IDE7CiAjZW5kaWYKIAotICAgIHItPmNvbm5lY3Rpb24tPndyaXRlLT5ldmVudF9oYW5kbGVyID0gbmd4X2h0dHBfcGhhc2VfZXZlbnRfaGFuZGxlcjsKKyAgICByLT5jb25uZWN0aW9uLT53cml0ZS0+ZXZlbnRfaGFuZGxlciA9IG5neF9odHRwX2NvcmVfcGhhc2VfZXZlbnRfaGFuZGxlcjsKIAotICAgIG5neF9odHRwX3J1bl9waGFzZXMocik7CisgICAgci0+dXJpX2NoYW5nZWQgPSAxOworICAgIHItPnVyaV9jaGFuZ2VzID0gMTE7CisKKyAgICBuZ3hfaHR0cF9jb3JlX3J1bl9waGFzZXMocik7CiAKICAgICByZXR1cm47CiB9CiAKIAotc3RhdGljIHZvaWQgbmd4X2h0dHBfcGhhc2VfZXZlbnRfaGFuZGxlcihuZ3hfZXZlbnRfdCAqZXYpCitzdGF0aWMgdm9pZCBuZ3hfaHR0cF9jb3JlX3BoYXNlX2V2ZW50X2hhbmRsZXIobmd4X2V2ZW50X3QgKmV2KQogewogICAgIG5neF9jb25uZWN0aW9uX3QgICAgKmM7CiAgICAgbmd4X2h0dHBfcmVxdWVzdF90ICAqcjsKQEAgLTQxNywxNSArNDMxLDE0IEBACiAKICAgICBuZ3hfbG9nX2RlYnVnMChOR1hfTE9HX0RFQlVHX0hUVFAsIGV2LT5sb2csIDAsICJwaGFzZSBldmVudCBoYW5kbGVyIik7CiAKLSAgICBuZ3hfaHR0cF9ydW5fcGhhc2VzKHIpOworICAgIG5neF9odHRwX2NvcmVfcnVuX3BoYXNlcyhyKTsKIAogICAgIHJldHVybjsKIH0KIAogCi1zdGF0aWMgdm9pZCBuZ3hfaHR0cF9ydW5fcGhhc2VzKG5neF9odHRwX3JlcXVlc3RfdCAqcikKK3N0YXRpYyB2b2lkIG5neF9odHRwX2NvcmVfcnVuX3BoYXNlcyhuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpCiB7Ci0gICAgY2hhciAgICAgICAgICAgICAgICAgICAgICAgKnBhdGg7CiAgICAgbmd4X2ludF90ICAgICAgICAgICAgICAgICAgIHJjOwogICAgIG5neF9odHRwX2hhbmRsZXJfcHQgICAgICAgICpoOwogICAgIG5neF9odHRwX2NvcmVfbG9jX2NvbmZfdCAgICpjbGNmOwpAQCAtNDM1LDEwICs0NDgsMzggQEAKIAogICAgIGZvciAoLyogdm9pZCAqLzsgci0+cGhhc2UgPCBOR1hfSFRUUF9MQVNUX1BIQVNFOyByLT5waGFzZSsrKSB7CiAKKyAgICAgICAgaWYgKHItPnBoYXNlID09IE5HWF9IVFRQX0ZJTkRfQ09ORklHX1BIQVNFICYmICFyLT51cmlfY2hhbmdlZCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoci0+cGhhc2UgPT0gTkdYX0hUVFBfRklORF9DT05GSUdfUEhBU0UgKyAxICYmIHItPnVyaV9jaGFuZ2VkKSB7CisKKyAgICAgICAgICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfSFRUUCwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgInVyaSBjaGFuZ2VzOiAlZCIsIHItPnVyaV9jaGFuZ2VzKTsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIGdjYyBiZWZvcmUgMy4zIGNvbXBpbGVzIHRoZSBicm9rZW4gY29kZSBmb3IKKyAgICAgICAgICAgICAqICAgICBpZiAoci0+dXJpX2NoYW5nZXMtLSA9PSAwKQorICAgICAgICAgICAgICogaWYgdGhlIHItPnVyaV9jaGFuZ2VzIGlzIGRlZmluZWQgYXMKKyAgICAgICAgICAgICAqICAgICB1bnNpZ25lZCAgdXJpX2NoYW5nZXM6NAorICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIHItPnVyaV9jaGFuZ2VzLS07CisKKyAgICAgICAgICAgIGlmIChyLT51cmlfY2hhbmdlcyA9PSAwKSB7CisgICAgICAgICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0VSUiwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJld3JpdGUgY3ljbGUiKTsKKyAgICAgICAgICAgICAgICBuZ3hfaHR0cF9maW5hbGl6ZV9yZXF1ZXN0KHIsIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByLT51cmlfY2hhbmdlZCA9IDA7CisgICAgICAgICAgICByLT5waGFzZSA9IE5HWF9IVFRQX1JFV1JJVEVfUEhBU0U7CisgICAgICAgIH0KKwogICAgICAgICBpZiAoci0+cGhhc2UgPT0gTkdYX0hUVFBfQ09OVEVOVF9QSEFTRSAmJiByLT5jb250ZW50X2hhbmRsZXIpIHsKICAgICAgICAgICAgIHItPmNvbm5lY3Rpb24tPndyaXRlLT5ldmVudF9oYW5kbGVyID0gbmd4X2h0dHBfZW1wdHlfaGFuZGxlcjsKLSAgICAgICAgICAgIHJjID0gci0+Y29udGVudF9oYW5kbGVyKHIpOwotICAgICAgICAgICAgbmd4X2h0dHBfZmluYWxpemVfcmVxdWVzdChyLCByYyk7CisgICAgICAgICAgICBuZ3hfaHR0cF9maW5hbGl6ZV9yZXF1ZXN0KHIsIHItPmNvbnRlbnRfaGFuZGxlcihyKSk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtNDgzLDIxICs1MjQsMTUgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8qIG5vIGNvbnRlbnQgaGFuZGxlciB3YXMgZm91bmQgKi8KIAogICAgIGlmIChyLT51cmkuZGF0YVtyLT51cmkubGVuIC0gMV0gPT0gJy8nKSB7CiAKICAgICAgICAgY2xjZiA9IG5neF9odHRwX2dldF9tb2R1bGVfbG9jX2NvbmYociwgbmd4X2h0dHBfY29yZV9tb2R1bGUpOwogCi0gICAgICAgIGlmICghKHBhdGggPSBuZ3hfcGFsbG9jKHItPnBvb2wsIGNsY2YtPnJvb3QubGVuICsgci0+dXJpLmxlbikpKSB7Ci0gICAgICAgICAgICBuZ3hfaHR0cF9maW5hbGl6ZV9yZXF1ZXN0KHIsIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAKLSAgICAgICAgbmd4X2NweXN0cm4obmd4X2NweW1lbShwYXRoLCBjbGNmLT5yb290LmRhdGEsIGNsY2YtPnJvb3QubGVuKSwKLSAgICAgICAgICAgICAgICAgICAgci0+dXJpLmRhdGEsIHItPnVyaS5sZW4gKyAxKTsKLSAgICAKICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0VSUiwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAotICAgICAgICAgICAgICAgICAgICAgICJkaXJlY3RvcnkgaW5kZXggb2YgXCIlc1wiIGlzIGZvcmJpZGRlbiIsIHBhdGgpOworICAgICAgICAgICAgICAgICAgICAgICJkaXJlY3RvcnkgaW5kZXggb2YgXCIlViVWXCIgaXMgZm9yYmlkZGVuIiwKKyAgICAgICAgICAgICAgICAgICAgICAmY2xjZi0+cm9vdCwgJnItPnVyaSk7CiAKICAgICAgICAgbmd4X2h0dHBfZmluYWxpemVfcmVxdWVzdChyLCBOR1hfSFRUUF9GT1JCSURERU4pOwogICAgICAgICByZXR1cm47CkBAIC01MTgsNyArNTUzLDcgQEAKIAogICAgIGNzY2YgPSBuZ3hfaHR0cF9nZXRfbW9kdWxlX3Nydl9jb25mKHIsIG5neF9odHRwX2NvcmVfbW9kdWxlKTsKIAotICAgIHJjID0gbmd4X2h0dHBfZmluZF9sb2NhdGlvbihyLCAmY3NjZi0+bG9jYXRpb25zLCAwKTsKKyAgICByYyA9IG5neF9odHRwX2NvcmVfZmluZF9sb2NhdGlvbihyLCAmY3NjZi0+bG9jYXRpb25zLCAwKTsKIAogICAgIGlmIChyYyA9PSBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IpIHsKICAgICAgICAgcmV0dXJuIHJjOwpAQCAtNTgzLDggKzYxOCw4IEBACiB9CiAKIAotc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9maW5kX2xvY2F0aW9uKG5neF9odHRwX3JlcXVlc3RfdCAqciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfYXJyYXlfdCAqbG9jYXRpb25zLCBzaXplX3QgbGVuKQorc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9jb3JlX2ZpbmRfbG9jYXRpb24obmd4X2h0dHBfcmVxdWVzdF90ICpyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfYXJyYXlfdCAqbG9jYXRpb25zLCBzaXplX3QgbGVuKQogewogICAgIG5neF9pbnRfdCAgICAgICAgICAgICAgICAgIG4sIHJjOwogICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgIGksIGZvdW5kLCBub3JlZ2V4OwpAQCAtNjA0LDYgKzYzOSwxMCBAQAogICAgICAgICB9CiAjZW5kaWYKIAorICAgICAgICBpZiAoY2xjZnBbaV0tPm5vbmFtZSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBuZ3hfbG9nX2RlYnVnMihOR1hfTE9HX0RFQlVHX0hUVFAsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKICAgICAgICAgICAgICAgICAgICAgICAgImZpbmQgbG9jYXRpb246ICVzXCIlVlwiIiwKICAgICAgICAgICAgICAgICAgICAgICAgY2xjZnBbaV0tPmV4YWN0X21hdGNoID8gIj0gIiA6ICIiLCAmY2xjZnBbaV0tPm5hbWUpOwpAQCAtNjMyLDkgKzY3MSwxNCBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKG4gPT0gMCkgewotICAgICAgICAgICAgaWYgKGNsY2ZwW2ldLT5leGFjdF9tYXRjaCAmJiByLT51cmkubGVuID09IGNsY2ZwW2ldLT5uYW1lLmxlbikgewotICAgICAgICAgICAgICAgIHItPmxvY19jb25mID0gY2xjZnBbaV0tPmxvY19jb25mOwotICAgICAgICAgICAgICAgIHJldHVybiBOR1hfSFRUUF9MT0NBVElPTl9FWEFDVDsKKyAgICAgICAgICAgIGlmIChjbGNmcFtpXS0+ZXhhY3RfbWF0Y2gpIHsKKworICAgICAgICAgICAgICAgIGlmIChyLT51cmkubGVuID09IGNsY2ZwW2ldLT5uYW1lLmxlbikgeworICAgICAgICAgICAgICAgICAgICByLT5sb2NfY29uZiA9IGNsY2ZwW2ldLT5sb2NfY29uZjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9IVFRQX0xPQ0FUSU9OX0VYQUNUOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAobGVuID4gY2xjZnBbaV0tPm5hbWUubGVuKSB7CkBAIC02NTIsNyArNjk2LDcgQEAKICAgICAgICAgY2xjZiA9IG5neF9odHRwX2dldF9tb2R1bGVfbG9jX2NvbmYociwgbmd4X2h0dHBfY29yZV9tb2R1bGUpOwogCiAgICAgICAgIGlmIChjbGNmLT5sb2NhdGlvbnMubmVsdHMpIHsKLSAgICAgICAgICAgIHJjID0gbmd4X2h0dHBfZmluZF9sb2NhdGlvbihyLCAmY2xjZi0+bG9jYXRpb25zLCBsZW4pOworICAgICAgICAgICAgcmMgPSBuZ3hfaHR0cF9jb3JlX2ZpbmRfbG9jYXRpb24ociwgJmNsY2YtPmxvY2F0aW9ucywgbGVuKTsKIAogICAgICAgICAgICAgaWYgKHJjICE9IE5HWF9PSykgewogICAgICAgICAgICAgICAgIHJldHVybiByYzsKQEAgLTY3NCw2ICs3MTgsMTAgQEAKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKGNsY2ZwW2ldLT5ub25hbWUpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKICAgICAgICAgbmd4X2xvZ19kZWJ1ZzEoTkdYX0xPR19ERUJVR19IVFRQLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICJmaW5kIGxvY2F0aW9uOiB+IFwiJVZcIiIsICZjbGNmcFtpXS0+bmFtZSk7CiAKQEAgLTcwNiw2ICs3NTQsNyBAQAogCiBuZ3hfaW50X3Qgbmd4X2h0dHBfc2V0X2NvbnRlbnRfdHlwZShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpCiB7CisgICAgdV9jaGFyICAgICAgICAgICAgICAgICAgICAgYywgKnAsICpleHRlbjsKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICBrZXk7CiAgICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgaTsKICAgICBuZ3hfaHR0cF90eXBlX3QgICAgICAgICAgICp0eXBlOwpAQCAtNzI0LDYgKzc3MywzNyBAQAogICAgIGNsY2YgPSBuZ3hfaHR0cF9nZXRfbW9kdWxlX2xvY19jb25mKHIsIG5neF9odHRwX2NvcmVfbW9kdWxlKTsKIAogICAgIGlmIChyLT5leHRlbi5sZW4pIHsKKworICAgICAgICBpZiAoIXItPmxvd19jYXNlX2V4dGVuKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgci0+ZXh0ZW4ubGVuOyBpKyspIHsKKyAgICAgICAgICAgICAgICBjID0gci0+ZXh0ZW4uZGF0YVtpXTsKKyAgICAgICAgICAgICAgICBpZiAoYyA+PSAnQScgJiYgYyA8PSAnWicpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaSA8IHItPmV4dGVuLmxlbikgeworICAgICAgICAgICAgICAgIGlmICghKHAgPSBuZ3hfcGFsbG9jKHItPnBvb2wsIHItPmV4dGVuLmxlbikpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZXh0ZW4gPSBwOworCisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHItPmV4dGVuLmxlbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGMgPSByLT5leHRlbi5kYXRhW2ldOworICAgICAgICAgICAgICAgICAgICBpZiAoYyA+PSAnQScgJiYgYyA8PSAnWicpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwKysgPSAodV9jaGFyKSAoYyB8IDB4MjApOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgKnArKyA9IGM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByLT5leHRlbi5kYXRhID0gZXh0ZW47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHItPmxvd19jYXNlX2V4dGVuID0gMTsKKyAgICAgICAgfQorCiAjaWYgMAogICAgICAgICBrZXkgPSBuZ3hfY3JjKHItPmV4dGVuLmRhdGEsIHItPmV4dGVuLmtleSk7CiAjZW5kaWYKQEAgLTgyNiw2ICs5MDYsOCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgci0+bG93X2Nhc2VfZXh0ZW4gPSAwOworCiAgICAgcmV0dXJuIE5HWF9PSzsKIH0KIApAQCAtODY0LDYgKzk0Niw3IEBACiAKICAgICByLT5waGFzZSA9IDA7CiAgICAgci0+cGhhc2VfaGFuZGxlciA9IDA7CisgICAgci0+Y29udGVudF9oYW5kbGVyID0gTlVMTDsKIAogICAgIG5neF9odHRwX2hhbmRsZXIocik7CiAKQEAgLTg5Myw0OCArOTc2LDYwIEBACiAjZW5kaWYKIAogCi0jaWYgMAotCi1zdGF0aWMgbmd4X2ludF90IG5neF9odHRwX2NvcmVfaW5pdF9wcm9jZXNzKG5neF9jeWNsZV90ICpjeWNsZSkKK25neF9odHRwX3ZhcmlhYmxlX3QgKm5neF9odHRwX2FkZF92YXJpYWJsZShuZ3hfY29uZl90ICpjZikKIHsKLSAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgIGk7Ci0gICAgbmd4X2h0dHBfY29yZV9zcnZfY29uZl90ICAgKipjc2NmcDsKLSAgICBuZ3hfaHR0cF9jb3JlX21haW5fY29uZl90ICAgKmNtY2Y7CisgICAgbmd4X2h0dHBfdmFyaWFibGVfdCAgICAgICAgKnZhcjsKKyAgICBuZ3hfaHR0cF9jb3JlX21haW5fY29uZl90ICAqY21jZjsKIAotICAgIGNtY2YgPSBuZ3hfaHR0cF9jeWNsZV9nZXRfbW9kdWxlX21haW5fY29uZihjeWNsZSwgbmd4X2h0dHBfY29yZV9tb2R1bGUpOworICAgIGNtY2YgPSBuZ3hfaHR0cF9jb25mX2dldF9tb2R1bGVfbWFpbl9jb25mKGNmLCBuZ3hfaHR0cF9jb3JlX21vZHVsZSk7CiAKLSNpZiAwCi0gICAgbmd4X2h0dHBfY29yZV9pbml0X21vZHVsZToKLQotICAgIG5neF9odHRwX2hhbmRsZXJfcHQgICAgICAgICAqaDsKLQotICAgIG5neF90ZXN0X251bGwoaCwgbmd4X3B1c2hfYXJyYXkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjbWNmLT5waGFzZXNbTkdYX0hUVFBfVFJBTlNMQVRFX1BIQVNFXS5oYW5kbGVycyksCi0gICAgICAgICAgICAgICAgICBOR1hfRVJST1IpOwotICAgICpoID0gbmd4X2h0dHBfZGVsYXlfaGFuZGxlcjsKLSNlbmRpZgotCi0gICAgY3NjZnAgPSBjbWNmLT5zZXJ2ZXJzLmVsdHM7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgY21jZi0+c2VydmVycy5uZWx0czsgaSsrKSB7Ci0gICAgICAgIGlmIChjc2NmcFtpXS0+cmVjdiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBjc2NmcFtpXS0+cmVjdiA9IG5neF9pby5yZWN2OwotICAgICAgICAgICAgY3NjZnBbaV0tPnNlbmRfY2hhaW4gPSBuZ3hfaW8uc2VuZF9jaGFpbjsKKyAgICBpZiAoY21jZi0+dmFyaWFibGVzLmVsdHMgPT0gTlVMTCkgeworICAgICAgICBpZiAobmd4X2FycmF5X2luaXQoJmNtY2YtPnZhcmlhYmxlcywgY2YtPnBvb2wsIDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yobmd4X2h0dHBfdmFyaWFibGVfdCkpID09IE5HWF9FUlJPUikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gTkdYX09LOworICAgIGlmICghKHZhciA9IG5neF9hcnJheV9wdXNoKCZjbWNmLT52YXJpYWJsZXMpKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICB2YXItPmluZGV4ID0gY21jZi0+dmFyaWFibGVzLm5lbHRzIC0gMTsKKworICAgIHJldHVybiB2YXI7CiB9CiAKLSNlbmRpZgorCituZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICpuZ3hfaHR0cF9nZXRfdmFyaWFibGUobmd4X2h0dHBfcmVxdWVzdF90ICpyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF91aW50X3QgaW5kZXgpCit7CisgICAgbmd4X2h0dHBfdmFyaWFibGVfdCAgICAgICAgKnY7CisgICAgbmd4X2h0dHBfY29yZV9tYWluX2NvbmZfdCAgKmNtY2Y7CisKKyAgICAvKiBUT0RPOiBjYWNoZWQgdmFyaWFibGVzICovCisKKyAgICBjbWNmID0gbmd4X2h0dHBfZ2V0X21vZHVsZV9tYWluX2NvbmYociwgbmd4X2h0dHBfY29yZV9tb2R1bGUpOworCisgICAgaWYgKGNtY2YtPnZhcmlhYmxlcy5lbHRzID09IE5VTEwgfHwgY21jZi0+dmFyaWFibGVzLm5lbHRzIDw9IGluZGV4KSB7CisgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19BTEVSVCwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICAgICJ1bmtub3duIHZhcmlhYmxlIGluZGV4OiAlZCIsIGluZGV4KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgdiA9IGNtY2YtPnZhcmlhYmxlcy5lbHRzOyAgICAKKworICAgIHJldHVybiB2W2luZGV4XS5oYW5kbGVyKHIsIHZbaW5kZXhdLmRhdGEpOworfQogCiAKLXN0YXRpYyBjaGFyICpuZ3hfc2VydmVyX2Jsb2NrKG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpjbWQsIHZvaWQgKmR1bW15KQorc3RhdGljIGNoYXIgKm5neF9odHRwX2NvcmVfc2VydmVyKG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZHVtbXkpCiB7CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICBtOwogICAgIGNoYXIgICAgICAgICAgICAgICAgICAgICAgICAqcnY7CiAgICAgbmd4X2h0dHBfbW9kdWxlX3QgICAgICAgICAgICptb2R1bGU7Ci0gICAgbmd4X2NvbmZfdCAgICAgICAgICAgICAgICAgICBwdmNmOworICAgIG5neF9jb25mX3QgICAgICAgICAgICAgICAgICAgc2F2ZTsKICAgICBuZ3hfaHR0cF9jb25mX2N0eF90ICAgICAgICAgKmN0eCwgKmh0dHBfY3R4OwogICAgIG5neF9odHRwX2NvcmVfbWFpbl9jb25mX3QgICAqY21jZjsKICAgICBuZ3hfaHR0cF9jb3JlX3Nydl9jb25mX3QgICAgKmNzY2YsICoqY3NjZnA7CkBAIC05ODksNjcgKzEwODQsMzIgQEAKIAogICAgIC8qIHBhcnNlIGluc2lkZSBzZXJ2ZXJ7fSAqLwogCi0gICAgcHZjZiA9ICpjZjsKKyAgICBzYXZlID0gKmNmOwogICAgIGNmLT5jdHggPSBjdHg7CiAgICAgY2YtPmNtZF90eXBlID0gTkdYX0hUVFBfU1JWX0NPTkY7CisKICAgICBydiA9IG5neF9jb25mX3BhcnNlKGNmLCBOVUxMKTsKLSAgICAqY2YgPSBwdmNmOworCisgICAgKmNmID0gc2F2ZTsKIAogICAgIGlmIChydiAhPSBOR1hfQ09ORl9PSykgewogICAgICAgICByZXR1cm4gcnY7CiAgICAgfQogCiAgICAgbmd4X3Fzb3J0KGNzY2YtPmxvY2F0aW9ucy5lbHRzLCAoc2l6ZV90KSBjc2NmLT5sb2NhdGlvbnMubmVsdHMsCi0gICAgICAgICAgICAgIHNpemVvZihuZ3hfaHR0cF9jb3JlX2xvY19jb25mX3QgKiksIG5neF9jbXBfbG9jYXRpb25zKTsKKyAgICAgICAgICAgICAgc2l6ZW9mKG5neF9odHRwX2NvcmVfbG9jX2NvbmZfdCAqKSwgbmd4X2h0dHBfY29yZV9jbXBfbG9jYXRpb25zKTsKIAogICAgIHJldHVybiBydjsKIH0KIAogCi1zdGF0aWMgaW50IG5neF9jbXBfbG9jYXRpb25zKGNvbnN0IHZvaWQgKm9uZSwgY29uc3Qgdm9pZCAqdHdvKQotewotICAgIG5neF9pbnRfdCAgICAgICAgICAgICAgICAgIHJjOwotICAgIG5neF9odHRwX2NvcmVfbG9jX2NvbmZfdCAgKmZpcnN0LCAqc2Vjb25kOwotCi0gICAgZmlyc3QgPSAqKG5neF9odHRwX2NvcmVfbG9jX2NvbmZfdCAqKikgb25lOwotICAgIHNlY29uZCA9ICoobmd4X2h0dHBfY29yZV9sb2NfY29uZl90ICoqKSB0d287Ci0KLSNpZiAoTkdYX1BDUkUpCi0KLSAgICBpZiAoZmlyc3QtPnJlZ2V4ICYmICFzZWNvbmQtPnJlZ2V4KSB7Ci0gICAgICAgIC8qIHNoaWZ0IHRoZSByZWdleCBtYXRjaGVzIHRvIHRoZSBlbmQgKi8KLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgaWYgKCFmaXJzdC0+cmVnZXggJiYgc2Vjb25kLT5yZWdleCkgewotICAgICAgICAvKiBzaGlmdCB0aGUgcmVnZXggbWF0Y2hlcyB0byB0aGUgZW5kICovCi0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBpZiAoZmlyc3QtPnJlZ2V4IHx8IHNlY29uZC0+cmVnZXgpIHsKLSAgICAgICAgLyogZG8gbm90IHNvcnQgdGhlIHJlZ2V4IG1hdGNoZXMgKi8KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0jZW5kaWYKLQotICAgIHJjID0gbmd4X3N0cmNtcChmaXJzdC0+bmFtZS5kYXRhLCBzZWNvbmQtPm5hbWUuZGF0YSk7Ci0KLSAgICBpZiAocmMgPT0gMCAmJiBzZWNvbmQtPmV4YWN0X21hdGNoKSB7Ci0gICAgICAgIC8qIGFuIGV4YWN0IG1hdGNoIG11c3QgYmUgYmVmb3JlIHRoZSBzYW1lIGluY2x1c2l2ZSBvbmUgKi8KLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgcmV0dXJuIChpbnQpIHJjOwotfQotCi0KLXN0YXRpYyBjaGFyICpuZ3hfbG9jYXRpb25fYmxvY2sobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwgdm9pZCAqZHVtbXkpCitzdGF0aWMgY2hhciAqbmd4X2h0dHBfY29yZV9sb2NhdGlvbihuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZHVtbXkpCiB7CiAgICAgY2hhciAgICAgICAgICAgICAgICAgICAgICAqcnY7CiAgICAgbmd4X2ludF90ICAgICAgICAgICAgICAgICAgbTsKICAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgICp2YWx1ZTsKLSAgICBuZ3hfY29uZl90ICAgICAgICAgICAgICAgICBwY2Y7CisgICAgbmd4X2NvbmZfdCAgICAgICAgICAgICAgICAgc2F2ZTsKICAgICBuZ3hfaHR0cF9tb2R1bGVfdCAgICAgICAgICptb2R1bGU7CiAgICAgbmd4X2h0dHBfY29uZl9jdHhfdCAgICAgICAqY3R4LCAqcGN0eDsKICAgICBuZ3hfaHR0cF9jb3JlX3Nydl9jb25mX3QgICpjc2NmOwpAQCAtMTE1MCw3ICsxMjEwLDkgQEAKICAgICAgICAgfQogCiAgICAgfSBlbHNlIHsKKyNpZiAwCiAgICAgICAgIGNsY2YtPnByZXZfbG9jYXRpb24gPSBwY2xjZjsKKyNlbmRpZgogCiAgICAgICAgIGlmIChwY2xjZi0+ZXhhY3RfbWF0Y2gpIHsKICAgICAgICAgICAgIG5neF9jb25mX2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBjZiwgMCwKQEAgLTExNzYsNyArMTIzOCw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAocGNsY2YtPmxvY2F0aW9ucy5lbHRzID09IE5VTEwpIHsKLSAgICAgICAgICAgIG5neF9pbml0X2FycmF5KHBjbGNmLT5sb2NhdGlvbnMsIGNmLT5wb29sLCA1LCBzaXplb2Yodm9pZCAqKSwKKyAgICAgICAgICAgIG5neF9pbml0X2FycmF5KHBjbGNmLT5sb2NhdGlvbnMsIGNmLT5wb29sLCA0LCBzaXplb2Yodm9pZCAqKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HWF9DT05GX0VSUk9SKTsKICAgICAgICAgfQogCkBAIC0xMTg3LDM4ICsxMjQ5LDEwMyBAQAogCiAgICAgKmNsY2ZwID0gY2xjZjsKIAotICAgIHBjZiA9ICpjZjsKKyAgICBzYXZlID0gKmNmOwogICAgIGNmLT5jdHggPSBjdHg7CiAgICAgY2YtPmNtZF90eXBlID0gTkdYX0hUVFBfTE9DX0NPTkY7CisKICAgICBydiA9IG5neF9jb25mX3BhcnNlKGNmLCBOVUxMKTsKLSAgICAqY2YgPSBwY2Y7CisKKyAgICAqY2YgPSBzYXZlOworCisgICAgaWYgKHJ2ICE9IE5HWF9DT05GX09LKSB7CisgICAgICAgIHJldHVybiBydjsKKyAgICB9CisKKyAgICBuZ3hfcXNvcnQoY2xjZi0+bG9jYXRpb25zLmVsdHMsIChzaXplX3QpIGNsY2YtPmxvY2F0aW9ucy5uZWx0cywKKyAgICAgICAgICAgICAgc2l6ZW9mKG5neF9odHRwX2NvcmVfbG9jX2NvbmZfdCAqKSwgbmd4X2h0dHBfY29yZV9jbXBfbG9jYXRpb25zKTsKIAogICAgIHJldHVybiBydjsKIH0KIAogCi1zdGF0aWMgY2hhciAqbmd4X3R5cGVzX2Jsb2NrKG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpjbWQsIHZvaWQgKmNvbmYpCitzdGF0aWMgaW50IG5neF9odHRwX2NvcmVfY21wX2xvY2F0aW9ucyhjb25zdCB2b2lkICpvbmUsIGNvbnN0IHZvaWQgKnR3bykKK3sKKyAgICBuZ3hfaW50X3QgICAgICAgICAgICAgICAgICByYzsKKyAgICBuZ3hfaHR0cF9jb3JlX2xvY19jb25mX3QgICpmaXJzdCwgKnNlY29uZDsKKworICAgIGZpcnN0ID0gKihuZ3hfaHR0cF9jb3JlX2xvY19jb25mX3QgKiopIG9uZTsKKyAgICBzZWNvbmQgPSAqKG5neF9odHRwX2NvcmVfbG9jX2NvbmZfdCAqKikgdHdvOworCisgICAgaWYgKGZpcnN0LT5ub25hbWUgJiYgIXNlY29uZC0+bm9uYW1lKSB7CisgICAgICAgIC8qIHNoaWZ0IG5vIG5hbWVkIGxvY2F0aW9ucyB0byB0aGUgZW5kICovCisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIGlmICghZmlyc3QtPm5vbmFtZSAmJiBzZWNvbmQtPm5vbmFtZSkgeworICAgICAgICAvKiBzaGlmdCBubyBuYW1lZCBsb2NhdGlvbnMgdG8gdGhlIGVuZCAqLworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKGZpcnN0LT5ub25hbWUgfHwgc2Vjb25kLT5ub25hbWUpIHsKKyAgICAgICAgLyogZG8gbm90IHNvcnQgbm8gbmFtZWQgbG9jYXRpb25zICovCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworI2lmIChOR1hfUENSRSkKKworICAgIGlmIChmaXJzdC0+cmVnZXggJiYgIXNlY29uZC0+cmVnZXgpIHsKKyAgICAgICAgLyogc2hpZnQgdGhlIHJlZ2V4IG1hdGNoZXMgdG8gdGhlIGVuZCAqLworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBpZiAoIWZpcnN0LT5yZWdleCAmJiBzZWNvbmQtPnJlZ2V4KSB7CisgICAgICAgIC8qIHNoaWZ0IHRoZSByZWdleCBtYXRjaGVzIHRvIHRoZSBlbmQgKi8KKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmIChmaXJzdC0+cmVnZXggfHwgc2Vjb25kLT5yZWdleCkgeworICAgICAgICAvKiBkbyBub3Qgc29ydCB0aGUgcmVnZXggbWF0Y2hlcyAqLworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyNlbmRpZgorCisgICAgcmMgPSBuZ3hfc3RyY21wKGZpcnN0LT5uYW1lLmRhdGEsIHNlY29uZC0+bmFtZS5kYXRhKTsKKworICAgIGlmIChyYyA9PSAwICYmIHNlY29uZC0+ZXhhY3RfbWF0Y2gpIHsKKyAgICAgICAgLyogYW4gZXhhY3QgbWF0Y2ggbXVzdCBiZSBiZWZvcmUgdGhlIHNhbWUgaW5jbHVzaXZlIG9uZSAqLworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICByZXR1cm4gKGludCkgcmM7Cit9CisKKworc3RhdGljIGNoYXIgKm5neF9odHRwX2NvcmVfdHlwZXMobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwgdm9pZCAqY29uZikKIHsKICAgICBjaGFyICAgICAgICAqcnY7Ci0gICAgbmd4X2NvbmZfdCAgIHBjZjsKKyAgICBuZ3hfY29uZl90ICAgc2F2ZTsKIAotICAgIHBjZiA9ICpjZjsKLSAgICBjZi0+aGFuZGxlciA9IG5neF9zZXRfdHlwZTsKKyAgICBzYXZlID0gKmNmOworICAgIGNmLT5oYW5kbGVyID0gbmd4X2h0dHBfY29yZV90eXBlOwogICAgIGNmLT5oYW5kbGVyX2NvbmYgPSBjb25mOworCiAgICAgcnYgPSBuZ3hfY29uZl9wYXJzZShjZiwgTlVMTCk7Ci0gICAgKmNmID0gcGNmOworCisgICAgKmNmID0gc2F2ZTsKIAogICAgIHJldHVybiBydjsKIH0KIAogCi1zdGF0aWMgY2hhciAqbmd4X3NldF90eXBlKG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpkdW1teSwgdm9pZCAqY29uZikKK3N0YXRpYyBjaGFyICpuZ3hfaHR0cF9jb3JlX3R5cGUobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmR1bW15LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjb25mKQogewogICAgIG5neF9odHRwX2NvcmVfbG9jX2NvbmZfdCAqbGNmID0gY29uZjsKIAogICAgIHVpbnQzMl90ICAgICAgICAgIGtleTsKICAgICBuZ3hfdWludF90ICAgICAgICBpOwotICAgIG5neF9zdHJfdCAgICAgICAgKmFyZ3M7CisgICAgbmd4X3N0cl90ICAgICAgICAqdmFsdWU7CiAgICAgbmd4X2h0dHBfdHlwZV90ICAqdHlwZTsKIAogICAgIGlmIChsY2YtPnR5cGVzID09IE5VTEwpIHsKQEAgLTEyMzcsMTcgKzEzNjQsMTcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGFyZ3MgPSAobmd4X3N0cl90ICopIGNmLT5hcmdzLT5lbHRzOworICAgIHZhbHVlID0gY2YtPmFyZ3MtPmVsdHM7CiAKICAgICBmb3IgKGkgPSAxOyBpIDwgY2YtPmFyZ3MtPm5lbHRzOyBpKyspIHsKLSAgICAgICAgbmd4X2h0dHBfdHlwZXNfaGFzaF9rZXkoa2V5LCBhcmdzW2ldKTsKKyAgICAgICAgbmd4X2h0dHBfdHlwZXNfaGFzaF9rZXkoa2V5LCB2YWx1ZVtpXSk7CiAKICAgICAgICAgaWYgKCEodHlwZSA9IG5neF9hcnJheV9wdXNoKCZsY2YtPnR5cGVzW2tleV0pKSkgewogICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgICAgICB9CiAKLSAgICAgICAgdHlwZS0+ZXh0ZW4gPSBhcmdzW2ldOwotICAgICAgICB0eXBlLT50eXBlID0gYXJnc1swXTsKKyAgICAgICAgdHlwZS0+ZXh0ZW4gPSB2YWx1ZVtpXTsKKyAgICAgICAgdHlwZS0+dHlwZSA9IHZhbHVlWzBdOwogICAgIH0KIAogICAgIHJldHVybiBOR1hfQ09ORl9PSzsKQEAgLTEyNTYsMTUgKzEzODMsMTcgQEAKIAogc3RhdGljIHZvaWQgKm5neF9odHRwX2NvcmVfY3JlYXRlX21haW5fY29uZihuZ3hfY29uZl90ICpjZikKIHsKLSAgICBuZ3hfaHR0cF9jb3JlX21haW5fY29uZl90ICpjbWNmOworICAgIG5neF9odHRwX2NvcmVfbWFpbl9jb25mX3QgICpjbWNmOwogCi0gICAgbmd4X3Rlc3RfbnVsbChjbWNmLAotICAgICAgICAgICAgICAgICAgbmd4X3BjYWxsb2MoY2YtPnBvb2wsIHNpemVvZihuZ3hfaHR0cF9jb3JlX21haW5fY29uZl90KSksCi0gICAgICAgICAgICAgICAgICBOR1hfQ09ORl9FUlJPUik7CisgICAgaWYgKCEoY21jZiA9IG5neF9wY2FsbG9jKGNmLT5wb29sLCBzaXplb2Yobmd4X2h0dHBfY29yZV9tYWluX2NvbmZfdCkpKSkgeworICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgfQogCi0gICAgbmd4X2luaXRfYXJyYXkoY21jZi0+c2VydmVycywgY2YtPnBvb2wsCi0gICAgICAgICAgICAgICAgICAgNSwgc2l6ZW9mKG5neF9odHRwX2NvcmVfc3J2X2NvbmZfdCAqKSwKLSAgICAgICAgICAgICAgICAgICBOR1hfQ09ORl9FUlJPUik7CisgICAgaWYgKG5neF9hcnJheV9pbml0KCZjbWNmLT5zZXJ2ZXJzLCBjZi0+cG9vbCwgNSwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5neF9odHRwX2NvcmVfc3J2X2NvbmZfdCAqKSkgPT0gTkdYX0VSUk9SKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgIH0KIAogICAgIGNtY2YtPnNlcnZlcl9uYW1lc19oYXNoID0gTkdYX0NPTkZfVU5TRVRfVUlOVDsKICAgICBjbWNmLT5zZXJ2ZXJfbmFtZXNfaGFzaF90aHJlc2hvbGQgPSBOR1hfQ09ORl9VTlNFVF9VSU5UOwpAQCAtMTM5Niw3ICsxNTI1LDcgQEAKIAogc3RhdGljIHZvaWQgKm5neF9odHRwX2NvcmVfY3JlYXRlX2xvY19jb25mKG5neF9jb25mX3QgKmNmKQogewotICAgIG5neF9odHRwX2NvcmVfbG9jX2NvbmZfdCAqbGNmOworICAgIG5neF9odHRwX2NvcmVfbG9jX2NvbmZfdCAgKmxjZjsKIAogICAgIG5neF90ZXN0X251bGwobGNmLAogICAgICAgICAgICAgICAgICAgbmd4X3BjYWxsb2MoY2YtPnBvb2wsIHNpemVvZihuZ3hfaHR0cF9jb3JlX2xvY19jb25mX3QpKSwKQEAgLTE1NDcsNyArMTY3Niw4IEBACiB9CiAKIAotc3RhdGljIGNoYXIgKm5neF9odHRwX2xpc3RlbihuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLCB2b2lkICpjb25mKQorc3RhdGljIGNoYXIgKm5neF9odHRwX2NvcmVfbGlzdGVuKG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY29uZikKIHsKICAgICBuZ3hfaHR0cF9jb3JlX3Nydl9jb25mX3QgKnNjZiA9IGNvbmY7CiAKQEAgLTE2MzMsNyArMTc2Myw4IEBACiB9CiAKIAotc3RhdGljIGNoYXIgKm5neF9zZXRfc2VydmVyX25hbWUobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwgdm9pZCAqY29uZikKK3N0YXRpYyBjaGFyICpuZ3hfaHR0cF9jb3JlX3NlcnZlcl9uYW1lKG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjb25mKQogewogICAgIG5neF9odHRwX2NvcmVfc3J2X2NvbmZfdCAqc2NmID0gY29uZjsKIApAQCAtMTY4Myw3ICsxODE0LDcgQEAKIH0KIAogCi1zdGF0aWMgY2hhciAqbmd4X3NldF9yb290KG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpjbWQsIHZvaWQgKmNvbmYpCitzdGF0aWMgY2hhciAqbmd4X2h0dHBfY29yZV9yb290KG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpjbWQsIHZvaWQgKmNvbmYpCiB7CiAgICAgbmd4X2h0dHBfY29yZV9sb2NfY29uZl90ICpsY2YgPSBjb25mOwogCkBAIC0xNzIzLDcgKzE4NTQsOCBAQAogfQogCiAKLXN0YXRpYyBjaGFyICpuZ3hfc2V0X2Vycm9yX3BhZ2Uobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwgdm9pZCAqY29uZikKK3N0YXRpYyBjaGFyICpuZ3hfaHR0cF9jb3JlX2Vycm9yX3BhZ2Uobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY29uZikKIHsKICAgICBuZ3hfaHR0cF9jb3JlX2xvY19jb25mX3QgKmxjZiA9IGNvbmY7CiAKQEAgLTE3OTMsNyArMTkyNSw4IEBACiB9CiAKIAotc3RhdGljIGNoYXIgKm5neF9zZXRfa2VlcGFsaXZlKG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpjbWQsIHZvaWQgKmNvbmYpCitzdGF0aWMgY2hhciAqbmd4X2h0dHBfY29yZV9rZWVwYWxpdmUobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjb25mKQogewogICAgIG5neF9odHRwX2NvcmVfbG9jX2NvbmZfdCAqbGNmID0gY29uZjsKIApAQCAtMTgzMSw3ICsxOTY0LDggQEAKIH0KIAogCi1zdGF0aWMgY2hhciAqbmd4X3NldF9lcnJvcl9sb2cobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwgdm9pZCAqY29uZikKK3N0YXRpYyBjaGFyICpuZ3hfaHR0cF9jb3JlX2Vycm9yX2xvZyhuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNvbmYpCiB7CiAgICAgbmd4X2h0dHBfY29yZV9sb2NfY29uZl90ICpsY2YgPSBjb25mOwogCkBAIC0xODQzLDcgKzE5NzcsNyBAQAogfQogCiAKLXN0YXRpYyBjaGFyICpuZ3hfaHR0cF9sb3dhdF9jaGVjayhuZ3hfY29uZl90ICpjZiwgdm9pZCAqcG9zdCwgdm9pZCAqZGF0YSkKK3N0YXRpYyBjaGFyICpuZ3hfaHR0cF9jb3JlX2xvd2F0X2NoZWNrKG5neF9jb25mX3QgKmNmLCB2b2lkICpwb3N0LCB2b2lkICpkYXRhKQogewogI2lmIChOR1hfRlJFRUJTRCkKICAgICBzc2l6ZV90ICpucCA9IGRhdGE7CmRpZmYgLS1naXQgYS9zcmMvaHR0cC9uZ3hfaHR0cF9jb3JlX21vZHVsZS5oIGIvc3JjL2h0dHAvbmd4X2h0dHBfY29yZV9tb2R1bGUuaAppbmRleCBlZWU0M2JjLi4xYzYwOTkxIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9uZ3hfaHR0cF9jb3JlX21vZHVsZS5oCisrKyBiL3NyYy9odHRwL25neF9odHRwX2NvcmVfbW9kdWxlLmgKQEAgLTM3LDEzICszNywzNCBAQAogCiAKIHR5cGVkZWYgc3RydWN0IHsKKyAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICB2YWx1ZTsKKyAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgICB0ZXh0OworfSBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90OworCisKK3R5cGVkZWYgc3RydWN0IG5neF9odHRwX3ZhcmlhYmxlX3MgIG5neF9odHRwX3ZhcmlhYmxlX3Q7CisKK3R5cGVkZWYgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdAorICAgICAgICAgICAgICAgKigqbmd4X2h0dHBfZ2V0X3ZhcmlhYmxlX3B0KSAobmd4X2h0dHBfcmVxdWVzdF90ICpyLCB2b2lkICp2YXIpOworCisKK3N0cnVjdCBuZ3hfaHR0cF92YXJpYWJsZV9zIHsKKyAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgICBuYW1lOworICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgIGluZGV4OworICAgIG5neF9odHRwX2dldF92YXJpYWJsZV9wdCAgIGhhbmRsZXI7CisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAqZGF0YTsKKyAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICB1c2VzOworfTsKKworCit0eXBlZGVmIHN0cnVjdCB7CiAgICAgbmd4X2FycmF5X3QgICAgICAgICAgICAgICAgaGFuZGxlcnM7CiAgICAgbmd4X2ludF90ICAgICAgICAgICAgICAgICAgdHlwZTsgICAgICAgICAgICAgICAgLyogTkdYX09LLCBOR1hfREVDTElORUQgKi8KIH0gbmd4X2h0dHBfcGhhc2VfdDsKIAogCiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgbmd4X2FycmF5X3QgICAgICAgICAgICAgICAgc2VydmVyczsgLyogYXJyYXkgb2Ygbmd4X2h0dHBfY29yZV9zcnZfY29uZl90ICovCisgICAgbmd4X2FycmF5X3QgICAgICAgICAgICAgICAgc2VydmVyczsgICAgICAgICAvKiBuZ3hfaHR0cF9jb3JlX3Nydl9jb25mX3QgKi8KIAogICAgIG5neF9odHRwX3BoYXNlX3QgICAgICAgICAgIHBoYXNlc1tOR1hfSFRUUF9MQVNUX1BIQVNFXTsKICAgICBuZ3hfYXJyYXlfdCAgICAgICAgICAgICAgICBpbmRleF9oYW5kbGVyczsKQEAgLTUyLDIwICs3MywyMiBAQAogICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgIHNlcnZlcl9uYW1lc19oYXNoX3RocmVzaG9sZDsKIAogICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgIG1heF9zZXJ2ZXJfbmFtZV9sZW47CisKKyAgICBuZ3hfYXJyYXlfdCAgICAgICAgICAgICAgICB2YXJpYWJsZXM7ICAgICAgICAvKiBuZ3hfaHR0cF92YXJpYWJsZV90ICovCiB9IG5neF9odHRwX2NvcmVfbWFpbl9jb25mX3Q7CiAKIAogdHlwZWRlZiBzdHJ1Y3QgewogICAgIC8qCi0gICAgICogYXJyYXkgb2Ygbmd4X2h0dHBfY29yZV9sb2NfY29uZl90LCB1c2VkIGluIHRoZSB0cmFuc2xhdGlvbiBoYW5kbGVyCi0gICAgICogYW5kIGluIHRoZSBtZXJnZSBwaGFzZQorICAgICAqIGFycmF5IG9mIHRoZSBuZ3hfaHR0cF9jb3JlX2xvY19jb25mX3QsCisgICAgICogdXNlZCBpbiB0aGUgdHJhbnNsYXRpb24gaGFuZGxlciBhbmQgaW4gdGhlIG1lcmdlIHBoYXNlCiAgICAgICovCiAgICAgbmd4X2FycmF5X3QgICAgICAgICAgICAgICAgbG9jYXRpb25zOwogCi0gICAgLyogImxpc3RlbiIsIGFycmF5IG9mIG5neF9odHRwX2xpc3Rlbl90ICovCisgICAgLyogYXJyYXkgb2YgdGhlIG5neF9odHRwX2xpc3Rlbl90LCAibGlzdGVuIiBkaXJlY3RpdmUgKi8KICAgICBuZ3hfYXJyYXlfdCAgICAgICAgICAgICAgICBsaXN0ZW47CiAKLSAgICAvKiAic2VydmVyX25hbWUiLCBhcnJheSBvZiBuZ3hfaHR0cF9zZXJ2ZXJfbmFtZV90ICovCisgICAgLyogYXJyYXkgb2YgdGhlIG5neF9odHRwX3NlcnZlcl9uYW1lX3QsICJzZXJ2ZXJfbmFtZSIgZGlyZWN0aXZlICovCiAgICAgbmd4X2FycmF5X3QgICAgICAgICAgICAgICAgc2VydmVyX25hbWVzOwogCiAgICAgLyogc2VydmVyIGN0eCAqLwpAQCAtMTU4LDYgKzE4MSw4IEBACiAgICAgbmd4X3JlZ2V4X3QgICpyZWdleDsKICNlbmRpZgogCisgICAgdW5zaWduZWQgICAgICBub25hbWU6MTsgICAvKiAiaWYgKCkge30iIGJsb2NrICovCisKICAgICB1bnNpZ25lZCAgICAgIGV4YWN0X21hdGNoOjE7CiAgICAgdW5zaWduZWQgICAgICBub3JlZ2V4OjE7CiAKQEAgLTIwNSwxOSArMjMwLDIxIEBACiAKICAgICBuZ3hfbG9nX3QgICAgKmVycl9sb2c7CiAKKyNpZiAwCiAgICAgbmd4X2h0dHBfY29yZV9sb2NfY29uZl90ICAqcHJldl9sb2NhdGlvbjsKKyNlbmRpZgogfTsKIAogCisKIGV4dGVybiBuZ3hfaHR0cF9tb2R1bGVfdCAgbmd4X2h0dHBfY29yZV9tb2R1bGVfY3R4OwogZXh0ZXJuIG5neF9tb2R1bGVfdCAgbmd4X2h0dHBfY29yZV9tb2R1bGU7CiAKLWV4dGVybiBpbnQgbmd4X2h0dHBfbWF4X21vZHVsZTsKK2V4dGVybiBuZ3hfdWludF90IG5neF9odHRwX21heF9tb2R1bGU7CiAKIAogCiBuZ3hfaW50X3Qgbmd4X2h0dHBfZmluZF9sb2NhdGlvbl9jb25maWcobmd4X2h0dHBfcmVxdWVzdF90ICpyKTsKLW5neF9pbnRfdCBuZ3hfaHR0cF9jb3JlX3RyYW5zbGF0ZV9oYW5kbGVyKG5neF9odHRwX3JlcXVlc3RfdCAqcik7CiAKIG5neF9pbnRfdCBuZ3hfaHR0cF9zZXRfY29udGVudF90eXBlKG5neF9odHRwX3JlcXVlc3RfdCAqcik7CiBuZ3hfaW50X3Qgbmd4X2h0dHBfc2V0X2V4dGVuKG5neF9odHRwX3JlcXVlc3RfdCAqcik7CkBAIC0yMjUsNiArMjUyLDEwIEBACiBuZ3hfaW50X3Qgbmd4X2h0dHBfaW50ZXJuYWxfcmVkaXJlY3Qobmd4X2h0dHBfcmVxdWVzdF90ICpyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9zdHJfdCAqdXJpLCBuZ3hfc3RyX3QgKmFyZ3MpOwogCituZ3hfaHR0cF92YXJpYWJsZV90ICpuZ3hfaHR0cF9hZGRfdmFyaWFibGUobmd4X2NvbmZfdCAqY2YpOworbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAqbmd4X2h0dHBfZ2V0X3ZhcmlhYmxlKG5neF9odHRwX3JlcXVlc3RfdCAqciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfdWludF90IGluZGV4KTsKKwogCiB0eXBlZGVmIG5neF9pbnRfdCAoKm5neF9odHRwX291dHB1dF9oZWFkZXJfZmlsdGVyX3B0KShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpOwogdHlwZWRlZiBuZ3hfaW50X3QgKCpuZ3hfaHR0cF9vdXRwdXRfYm9keV9maWx0ZXJfcHQpCmRpZmYgLS1naXQgYS9zcmMvaHR0cC9uZ3hfaHR0cF9sb2dfaGFuZGxlci5jIGIvc3JjL2h0dHAvbmd4X2h0dHBfbG9nX2hhbmRsZXIuYwppbmRleCAxNDIwMTA3Li5kNGY5MDZmIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9uZ3hfaHR0cF9sb2dfaGFuZGxlci5jCisrKyBiL3NyYy9odHRwL25neF9odHRwX2xvZ19oYW5kbGVyLmMKQEAgLTg5Myw4ICs4OTMsOCBAQAogCiAgICAgZm10LT5uYW1lID0gdmFsdWVbMV07CiAKLSAgICBpZiAoIShmbXQtPm9wcyA9IG5neF9jcmVhdGVfYXJyYXkoY2YtPnBvb2wsIDIwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yobmd4X2h0dHBfbG9nX29wX3QpKSkpIHsKKyAgICBpZiAoIShmbXQtPm9wcyA9IG5neF9hcnJheV9jcmVhdGUoY2YtPnBvb2wsIDIwLCBzaXplb2Yobmd4X2h0dHBfbG9nX29wX3QpKSkpCisgICAgewogICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvaHR0cC9uZ3hfaHR0cF9wYXJzZS5jIGIvc3JjL2h0dHAvbmd4X2h0dHBfcGFyc2UuYwppbmRleCBiMTdjMjAwLi5mNTkxMmFjIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9uZ3hfaHR0cF9wYXJzZS5jCisrKyBiL3NyYy9odHRwL25neF9odHRwX3BhcnNlLmMKQEAgLTIyOSw2ICsyMjksOSBAQAogICAgICAgICAgICAgY2FzZSAnLyc6CiAgICAgICAgICAgICAgICAgci0+Y29tcGxleF91cmkgPSAxOwogICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnKyc6CisgICAgICAgICAgICAgICAgci0+cGx1c19pbl91cmkgPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAnPyc6CiAgICAgICAgICAgICAgICAgci0+YXJnc19zdGFydCA9IHAgKyAxOwogICAgICAgICAgICAgICAgIHN0YXRlID0gc3dfdXJpOwpAQCAtMjY4LDYgKzI3MSw5IEBACiAgICAgICAgICAgICAgICAgci0+dXJpX2V4dCA9IE5VTEw7CiAgICAgICAgICAgICAgICAgc3RhdGUgPSBzd19hZnRlcl9zbGFzaF9pbl91cmk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICcrJzoKKyAgICAgICAgICAgICAgICByLT5wbHVzX2luX3VyaSA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlICclJzoKICAgICAgICAgICAgICAgICByLT5xdW90ZWRfdXJpID0gMTsKICAgICAgICAgICAgICAgICBzdGF0ZSA9IHN3X3VyaTsKQEAgLTI5MSw2ICsyOTcsOSBAQAogICAgICAgICAgICAgICAgIHItPnVyaV9lbmQgPSBwOwogICAgICAgICAgICAgICAgIHItPmh0dHBfbWlub3IgPSA5OwogICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgICAgIGNhc2UgJysnOgorICAgICAgICAgICAgICAgIHItPnBsdXNfaW5fdXJpID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgJyAnOgogICAgICAgICAgICAgICAgIHItPnVyaV9lbmQgPSBwOwogICAgICAgICAgICAgICAgIHN0YXRlID0gc3dfaHR0cF8wOTsKZGlmZiAtLWdpdCBhL3NyYy9odHRwL25neF9odHRwX3JlcXVlc3QuaCBiL3NyYy9odHRwL25neF9odHRwX3JlcXVlc3QuaAppbmRleCAxNDEyMWQxLi5hNGUzZDBlIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9uZ3hfaHR0cF9yZXF1ZXN0LmgKKysrIGIvc3JjL2h0dHAvbmd4X2h0dHBfcmVxdWVzdC5oCkBAIC0yOTgsNiArMjk4LDkgQEAKICAgICBuZ3hfaW50X3QgICAgICAgICAgICBwaGFzZV9oYW5kbGVyOwogICAgIG5neF9odHRwX2hhbmRsZXJfcHQgIGNvbnRlbnRfaGFuZGxlcjsKIAorICAgIG5neF91aW50X3QgICAgICAgICAgIG52YXJpYWJsZXM7CisgICAgdm9pZCAgICAgICAgICAgICAgICoqdmFyaWFibGVzOworCiAgICAgbmd4X2FycmF5X3QgICAgICAgICAgY2xlYW51cDsKIAogICAgIC8qIHVzZWQgdG8gbGVhcm4gdGhlIEFwYWNoZSBjb21wYXRpYmxlIHJlc3BvbnNlIGxlbmd0aCB3aXRob3V0IGEgaGVhZGVyICovCkBAIC0zMTMsMTQgKzMxNiwxOSBAQAogCiAgICAgdW5zaWduZWQgICAgICAgICAgICAgaHR0cF9zdGF0ZTo0OwogCi0jaWYgMAotICAgIC8qIFVSSSBpcyBub3Qgc3RhcnRlZCB3aXRoICcvJyAtICJHRVQgaHR0cDovLyIgKi8KLSAgICB1bnNpZ25lZCAgICAgICAgICAgICB1bnVzdWFsX3VyaToxOwotI2VuZGlmCiAgICAgLyogVVJJIHdpdGggIi8uIiBhbmQgb24gV2luMzIgd2l0aCAiLy8iICovCiAgICAgdW5zaWduZWQgICAgICAgICAgICAgY29tcGxleF91cmk6MTsKKwogICAgIC8qIFVSSSB3aXRoICIlIiAqLwogICAgIHVuc2lnbmVkICAgICAgICAgICAgIHF1b3RlZF91cmk6MTsKKworICAgIC8qIFVSSSB3aXRoICIrIiAqLworICAgIHVuc2lnbmVkICAgICAgICAgICAgIHBsdXNfaW5fdXJpOjE7CisKKyAgICB1bnNpZ25lZCAgICAgICAgICAgICB1cmlfY2hhbmdlZDoxOworICAgIHVuc2lnbmVkICAgICAgICAgICAgIHVyaV9jaGFuZ2VzOjQ7CisKKyAgICB1bnNpZ25lZCAgICAgICAgICAgICBsb3dfY2FzZV9leHRlbjoxOwogICAgIHVuc2lnbmVkICAgICAgICAgICAgIGhlYWRlcl90aW1lb3V0X3NldDoxOwogCiAgICAgdW5zaWduZWQgICAgICAgICAgICAgcHJveHk6MTsKZGlmZiAtLWdpdCBhL3NyYy9odHRwL25neF9odHRwX3Vwc3RyZWFtLmMgYi9zcmMvaHR0cC9uZ3hfaHR0cF91cHN0cmVhbS5jCmluZGV4IGRhZTgyNjkuLjExZTBmMzEgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL25neF9odHRwX3Vwc3RyZWFtLmMKKysrIGIvc3JjL2h0dHAvbmd4X2h0dHBfdXBzdHJlYW0uYwpAQCAtNjY0LDEzICs2NjQsMTQgQEAKIHN0YXRpYyB2b2lkIG5neF9odHRwX3Vwc3RyZWFtX3NlbmRfcmVzcG9uc2Uobmd4X2h0dHBfcmVxdWVzdF90ICpyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF91cHN0cmVhbV90ICp1KQogeworICAgIG5neF9pbnRfdCAgICAgICAgICAgICAgICAgIHJjOwogICAgIG5neF9ldmVudF9waXBlX3QgICAgICAgICAgKnA7CiAgICAgbmd4X2h0dHBfY29yZV9sb2NfY29uZl90ICAqY2xjZjsKIAorICAgIHJjID0gdS0+c2VuZF9oZWFkZXIocik7CiAKLSAgICBpZiAodS0+c2VuZF9oZWFkZXIocikgPT0gTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SKSB7Ci0gICAgICAgIG5neF9odHRwX3Vwc3RyZWFtX2ZpbmFsaXplX3JlcXVlc3QociwgdSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IpOworICAgIGlmIChyYyA9PSBOR1hfRVJST1IgfHwgcmMgPiBOR1hfT0spIHsKKyAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1fZmluYWxpemVfcmVxdWVzdChyLCB1LCByYyk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAK